在ASP </tentity>中正确返回任务<tentity>

时间:2015-02-06 01:48:43

标签: asp.net async-await

我有GenericRepositoryGenericMockRepository。我正在使用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. 作为任务或任务或任务运行,但永远不会结束,也不会给出结果

1 个答案:

答案 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( ... ));

需要等待异步方法。