测试一个';s填充了FromServicesAttribute

本文关键字:填充 FromServicesAttribute 一个 测试 | 更新日期: 2023-09-27 17:54:39

问题

我们有一个使用FromServicesAttribute填充的控制器属性。

[FromServices]
public IGenericRepository<TodoItem> TodoItemRepository { get; }

我们希望使用此属性进行测试。我们如何嘲笑它?例如,如果我们使用构造函数注入,我们可以将mock实现传递给构造函数。我们如何以这种方式处理房产?

我们目前的方法

这就是我们目前使用Moq的方式。

[Fact]
public void GetAll_GetsCollection()
{
    // setup mock repository
    var all = new List<TodoItem>()
    {
        new TodoItem(),
        new TodoItem(),
        new TodoItem()
    };            
    var mockRepo = new Mock<IGenericRepository<TodoItem>>();
    mockRepo.Setup(x => x.All()).Returns(all);
    // setup mock unit of work
    // including what the [FromService] property will return
    var mockUnitOfWork = new Mock<IUnitOfWork>();
    mockUnitOfWork
        .Setup(x =>x.TodoItemRepository)
        .Returns(mockRepo.Object);
    // test controller
    TodoController controller = new TodoController(mockUnitOfWork.Object);
    var result = controller.GetAll();
    Assert.Equal(3, result.Count());
}

这确实有效并通过了测试。也许这已经足够好了。我们是TDD的新手。

测试一个';s填充了FromServicesAttribute

使属性可设置(如果需要,则为内部(,并使用InternalsVisibleTo使setter对测试程序集可见。然后,在测试代码中构造对象后,设置属性。

或者,如果您在测试代码中使用DI,请创建一个伪IGenericRepository<TodoItem>,并让DI容器注入它。