【发布时间】: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