【发布时间】:2012-04-23 18:44:15
【问题描述】:
我已经有一段时间没有做任何 MVC 工作了,所以我希望我错过了一些东西。我正在尝试编写一个测试和控制器操作来简单地编辑一个名为“业务”的 DTO。
控制器动作:
[HttpPost]
public ActionResult Edit(string id, Business business)
{
try
{
var model = _businessRepository.Get(id);
if (model != null)
{
UpdateModel(model);
if (ModelState.IsValid)
{
_businessRepository.Save(model);
}
else
{
return View(business);
}
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
测试:
[TestMethod]
public void Edit_Post_Action_Updates_Model_And_Redirects()
{
// Arrange
var mockBusinessRepository = new Mock<IBusinessRepository>();
var model = new Business { Id = "1", Name = "Test" };
var expected = new Business { Id = "1", Name = "Not Test" };
// Set up result for business repository
mockBusinessRepository.Setup(m => m.Get(model.Id)).Returns(model);
mockBusinessRepository.Setup(m => m.Save(expected)).Returns(expected);
var businessController = new BusinessController(mockBusinessRepository.Object);
// Act
var result = businessController.Edit(model.Id, expected) as RedirectToRouteResult;
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(result.RouteValues["action"], "Index");
mockBusinessRepository.VerifyAll();
}
它给出异常的行是控制器中的 UpdateModel()。异常详情如下:
“值不能为空。参数名称:controllerContext”
【问题讨论】:
-
调用 save 方法时模型中有什么东西吗?模型的代码是什么?
-
没有
UpdateModel()的代码很难说,但我的猜测是它依赖于一个不是由您的单元测试构建的数据库上下文。 -
@Brian 我从来没有使用过 Save 方法,因为它在 UpdateModel 上死掉了。但模型只是 2 个字符串:Id 和 Name。
-
@GalacticCowboy UpdateModel() 函数内置在 MVC 中。我没有写。因为我没有使用 SQL,所以没有要构造的数据库上下文。我正在模拟存储库,这样我什至不必依赖存储库。这些在其他地方进行了测试。
标签: c# asp.net-mvc unit-testing