在 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);
    }

没有关于如何进行异步测试的文档,所以到目前为止:

  1. 如果我将此测试方法声明为 void,它不会被测试
  2. 作为 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( ... ));

它需要等待你的异步方法。