测试一个WebAPI异步方法的单元测试

4

我是一个新手,正在努力理解单元测试,并尝试提高我写的代码质量。

我创建了一个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();
    }

尝试强制转换为客户时,测试始终失败 {"对象引用未设置为对象实例。"}

我的测试有什么问题吗?


你确定 FakeCustomers().SingleOrDefault(cust => cust.customerID == id) 能正常工作吗?为什么不先尝试一个 Customer 对象呢? - AD.Net
FakeCustomers() 返回什么? - G. Stoynev
刚刚更新了示例。虚假客户是一个硬编码的客户列表。 - Diver Dan
1
你能展示一下堆栈跟踪吗? - Paulo Morgado
1个回答

3
你能尝试这种方式吗?
[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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接