【问题标题】:unit testing a webapi async action单元测试 webapi 异步操作
【发布时间】:2014-02-27 11:44:56
【问题描述】:

我是单元测试的新手,但我试图通过它来提高我编写的代码的质量。

我创建了一个 webapi2 项目,该项目返回客户喜欢

   public async Task<IHttpActionResult> GetCustomer([FromUri]int id)
    {
         var customer = await _repository.FindCustomerAsync(id);
         return Ok(customer);
    }

我的仓库

 public async Task<Customer> FindCustomerAsync(int id)
    {
        using (var context = new MyContext())
        {
            var result = await context.Customers.FindAsync(id);
            return result;    
        }

    }

以前我没有返回异步任务,因为它很容易测试。将操作迁移到异步任务让我有点难以测试。

我正在使用 Moq 和 Xunit,我的单元测试尝试看起来像

 [Fact()]
    public async void GetCustomer()
    {
        var id = 2;

        _customerMock.Setup(x => x.FindCustomerAsync(id))
            .Returns(Task.FromResult(FakeCustomers()
            .SingleOrDefault(cust => cust.customerID == id)));


        var controller = new CustomersController(_customerMock.Object).GetCustomer(id);
        var result = await controller as Customer;

        Assert.NotNull(result);

        //Assert.IsType<OkNegotiatedContentResult<Customer>>(negotiatedResult);
        //Assert.Equal(negotiatedResult.Content.customerID, id);
    }

我的假客户

  private IQueryable<Customer> FakeCustomers()
    {
        return new List<Customer>()
    {
        new Customer()
        {
            customerID = 1,
            firstName = "Brian",
            lastName = "Smith"
        },
        new Customer()
        {
            customerID = 2,
            firstName = "Tom",
        }
    }.AsQueryable();
    }

在尝试强制转换为 Customer {"Object reference not set to an instance of an object."}

时,测试总是失败

我的测试做错了什么?

【问题讨论】:

  • 你确定 FakeCustomers() .SingleOrDefault(cust => cust.customerID == id) 确实有效,为什么不先尝试一个 Customer 对象。
  • FakeCustomers() 返回什么?
  • 刚刚更新了示例。假客户是硬编码的客户列表
  • 你能告诉我们堆栈跟踪吗?

标签: c# moq async-await xunit.net


【解决方案1】:

你可以试试这个方法吗?:

[Fact()]
public async void GetCustomer()
{
    var id = 2;

    _customerMock.Setup(x => x.FindCustomerAsync(id))
        .Returns(Task.FromResult(new Customer()
                 {
                  customerID = 2,
                  firstName = "Tom",
                 }));


    var controller = new CustomersController(_customerMock.Object).GetCustomer(id);
    var result = await controller as Customer;

    Assert.NotNull(result);
}

【讨论】:

    猜你喜欢
    • 2012-05-20
    • 2017-10-14
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多