C# 单元测试webapi异步操作

C# 单元测试webapi异步操作,c#,moq,async-await,xunit.net,C#,Moq,Async Await,Xunit.net,我对单元测试还不熟悉,但我一直在努力提高我编写的代码的质量 我创建了一个webapi2项目,它返回了一个类似 public async Task<IHttpActionResult> GetCustomer([FromUri]int id) { var customer = await _repository.FindCustomerAsync(id); return Ok(customer); } 公共异步任务GetCus

我对单元测试还不熟悉,但我一直在努力提高我编写的代码的质量

我创建了一个webapi2项目,它返回了一个类似

   public async Task<IHttpActionResult> GetCustomer([FromUri]int id)
    {
         var customer = await _repository.FindCustomerAsync(id);
         return Ok(customer);
    }
公共异步任务GetCustomer([FromUri]int-id)
{
var customer=await_repository.findcustomeasync(id);
返回Ok(客户);
}
我的存储库

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

    }
公共异步任务FindCustomerAsync(int-id)
{
使用(var context=new MyContext())
{
var result=wait context.Customers.FindAsync(id);
返回结果;
}
}
以前我没有返回异步任务,因为它很容易测试。将操作迁移到异步任务使我很难进行测试

我正在使用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);
    }
[Fact()]
公共异步void GetCustomer()
{
var-id=2;
_customerMock.Setup(x=>x.FindCustomerAsync(id))
.Returns(Task.FromResult(FakeCustomers)()
.SingleOrDefault(cust=>cust.customerID==id));
var controller=newcustomerscontroller(\u customerMock.Object).GetCustomer(id);
var结果=等待控制器作为客户;
Assert.NotNull(结果);
//IsType(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();
    }
private IQueryable伪造客户()
{
返回新列表()
{
新客户()
{
customerID=1,
firstName=“布赖恩”,
lastName=“史密斯”
},
新客户()
{
customerID=2,
firstName=“汤姆”,
}
}.AsQueryable();
}
当尝试强制转换到客户{“对象引用未设置为对象的实例”时,测试总是失败

我的考试有什么问题

你能这样试试吗

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

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