Es ist eine Weile her, seit ich MVC gearbeitet habe, so dass ich hoffentlich etwas vermisse. Ich versuche, eine Test- und Controller-Aktion zu schreiben, um einfach ein DTO namens "Business" zu bearbeiten.Grundlegende MVC3 UnitTest schlägt fehl UpdateModel()
Controller Aktion:
[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();
}
}
Test:
[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();
}
Die Linie, die es auf eine Ausnahme geben, ist das Updatemodel() in der Steuerung. Die Ausnahmedetails sind:
"Wert nicht null sein kann Parametername:. Controller"
gibt es etwas, in dem Modell, wenn Sie den Anruf sparen Methode? Was ist der Code für das Modell? – Brian
Ohne den Code für 'UpdateModel()' ist es schwer zu sagen, aber mein * rate * ist, dass es sich auf einen db-Kontext verlässt, der nicht von Ihrem Komponententest erstellt wird. – GalacticCowboy
@Brian Ich komme nie auf die Save-Methode, weil es auf UpdateModel stirbt. Aber das Modell ist einfach 2 Strings: Id und Name. – mandreko