【发布时间】:2014-08-15 23:27:38
【问题描述】:
我正在关注一篇文章 - http://www.asp.net/web-api/overview/testing-and-debugging/mocking-entity-framework-when-unit-testing-aspnet-web-api-2 - 对 Web API 2 控制器进行单元测试。
在那里,作者测试put方法如下:
//....
Product GetDemoProduct()
{
return new Product() { Id = 3, Name = "Demo name", Price = 5 };
}
[TestMethod]
public void PutProduct_ShouldReturnStatusCode()
{
var controller = new ProductController(new TestStoreAppContext());
//** Edited myself from original:
//** var item = GetDemoProduct();
var updatedItem = new Product(){ Id = 3, Name = "Demo name", Price = 6 };
var result = controller.PutProduct(3, updatedItem) as StatusCodeResult;
Assert.IsNotNull(result);
Assert.IsInstanceOfType(result, typeof(StatusCodeResult));
Assert.AreEqual(HttpStatusCode.NoContent, result.StatusCode);
//** Added a new assertion.
Assert.AreEqual(updatedItem.Price, GetDemoProduct().Price);
}
哪些测试将方法放入控制器中
public IHttpActionResult PutProduct(int id, Product product)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != product.Id)
{
return BadRequest();
}
//db.Entry(product).State = EntityState.Modified;
db.MarkAsModified(product);
try
{
db.SaveChanges();
}
//....
return StatusCode(HttpStatusCode.NoContent);
}
为了验证更新确实发生了,我在原始测试方法中添加了几行,在块中用 ** 表示。
嗯,模拟数据项最终没有得到更新。价格与更新前的产品价格保持一致。
db.SaveChanges(); 怎么来的?不行吗?
【问题讨论】:
-
var updatedItem = new item(){ Id =你在某处有一个类叫item? -
对不起,那是复制粘贴的错字。它应该是 Product 实例。
-
因此,如果没有断言 updatedItem == pre-updatedItem,示例单元测试就可以了。它返回 NoCoentent 状态代码。只是它实际上并没有更新模拟数据库。
标签: c# asp.net entity-framework unit-testing asp.net-web-api2