在 ASP 中正确返回任务<TEntity>
Returning a Task<TEntity> correctly in ASP
我有一个 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
,它不会被测试
- 作为 Task 或 Task 或 Task 它运行但永远不会结束也不会给出结果
改变
public async void CanRetrieveSingleContact()
到
public async Task CanRetrieveSingleContact()
TAP 编程和单元测试有点棘手,是的,它会失败但不会告诉您原因。
测试资源管理器需要知道它在做什么。如果你 return void
,它会忽略它并继续它的快乐方式。但是如果你returnTask
,它就知道等
您遗漏的另一件事是:
public async Task<TEntity> GetByIDAsync(object id)
然后
return await Task.FromResult<TEntity>(entities.SingleOrDefault( ... ));
它需要等待你的异步方法。
我有一个 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
,它不会被测试 - 作为 Task 或 Task 或 Task 它运行但永远不会结束也不会给出结果
改变
public async void CanRetrieveSingleContact()
到
public async Task CanRetrieveSingleContact()
TAP 编程和单元测试有点棘手,是的,它会失败但不会告诉您原因。
测试资源管理器需要知道它在做什么。如果你 return void
,它会忽略它并继续它的快乐方式。但是如果你returnTask
,它就知道等
您遗漏的另一件事是:
public async Task<TEntity> GetByIDAsync(object id)
然后
return await Task.FromResult<TEntity>(entities.SingleOrDefault( ... ));
它需要等待你的异步方法。