Sha*_*tin 2 c# asp.net-mvc unit-testing moq asp.net-core
我们有一个控制器属性,使用FromServicesAttribute.
[FromServices]
public IGenericRepository<TodoItem> TodoItemRepository { get; }
Run Code Online (Sandbox Code Playgroud)
我们想要使用此属性进行测试.我们如何嘲笑它?例如,如果我们使用构造函数注入,我们可以将模拟实现传递给构造函数.我们如何用这种方式做一个属性?
这就是我们目前正在做的事情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());
}
Run Code Online (Sandbox Code Playgroud)
这确实有效并通过测试.也许它足够好了.我们是TDD的新手.
使属性可设置(如果需要,可以使用内部)并使用该属性InternalsVisibleTo使测试程序集可见setter.然后,在测试代码中构造对象后,设置属性.
或者,如果您在测试代码中使用DI,请创建一个假的IGenericRepository<TodoItem>并让DI容器注入它.
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |