我有GenericRepository
和GenericMockRepository
。我正在使用async
方法。
这是我的代码
// GenericRepository - uses a DbContext context subclass with connection strings and stuff
public Task<TEntity> GetByIDAsync(object id) {
return context.FindAsync(id)
}
// GenericMockRepository - uses a List<TEntity> entities
public Task<TEntity> GetByIDAsync(object id) {
// THIS DOESN'T WORK
return new Task<TEntity>(() => {
return entities.SingleOrDefault(entity => {
var property = entity.GetType().GetProperty("ID");
if (property != null && property.GetValue(entity) == id) {
return true;
}
return false;
});
});
}
基本上,当请求通过浏览器并且框架实例化Controller
时,会调用第一个。第二个从单元测试项目
对于这两种情况,Controller的Details()
方法都是这样的:
// inside Details()
Customer customer = await UnitOfWork.CustomerRepository.GetByIDAsync(id.GetValueOrDefault());
以下是测试用例:
[TestMethod]
public async void CanRetrieveSingleContact() {
//Arrange
SetUp();
Customer customer = Customers.FirstOrDefault();
// Act
ViewResult result = await Controller.Details(customer.ID) as ViewResult;
// Assert
Customer model = result.ViewData.Model as Customer;
Assert.AreEqual(customer, model);
}
没有关于如何进行异步测试的文档,所以到目前为止:
void
,则不会对其进行测试答案 0 :(得分:1)
更改
public async void CanRetrieveSingleContact()
要
public async Task CanRetrieveSingleContact()
TAP编程和单元测试有点棘手,是的,它在没有告诉你原因的情况下失败了。
测试资源管理器需要知道它正在做什么。如果你返回void
,它会忽略它并继续它的快乐方式。但是如果你返回Task
,它就知道要等待。
您缺少的另一件事是:
public async Task<TEntity> GetByIDAsync(object id)
然后
return await Task.FromResult<TEntity>(entities.SingleOrDefault( ... ));
需要等待异步方法。