Ich habe mich durch Scott Guthries ausgezeichneten Post auf ASP.NET MVC Beta 1 gearbeitet. Darin zeigt er die Verbesserungen an der UpdateModel-Methode und wie sie Unit-Tests verbessern. Ich habe ein ähnliches Projekt neu erstellt, aber jedes Mal, wenn ich einen UnitTest mit einem Aufruf von UpdateModel ausführe, erhalte ich eine ArgumentNullException, die den Parameter controllerContext benennt.Wie teste ich Unit-Test-Aktionen ohne Mocking mit UpdateModel?
Hier die entsprechenden Bits, mit meinem Modell starten:
public class Country {
public Int32 ID { get; set; }
public String Name { get; set; }
public String Iso3166 { get; set; }
}
Der Controller Aktion:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Int32 id, FormCollection form)
{
using (ModelBindingDataContext db = new ModelBindingDataContext()) {
Country country = db.Countries.Where(c => c.CountryID == id).SingleOrDefault();
try {
UpdateModel(country, form);
db.SubmitChanges();
return RedirectToAction("Index");
}
catch {
return View(country);
}
}
}
Und schließlich Test meiner Einheit das ist versagt:
[TestMethod]
public void Edit()
{
CountryController controller = new CountryController();
FormCollection form = new FormCollection();
form.Add("Name", "Canada");
form.Add("Iso3166", "CA");
var result = controller.Edit(2 /*Canada*/, form) as RedirectToRouteResult;
Assert.IsNotNull(result, "Expected to be redirected on successful POST.");
Assert.AreEqual("Show", result.RouteName, "Expected to redirect to the View action.");
}
ArgumentNullException
geworfen wird durch den Aufruf an UpdateModel
mit der Nachricht "Wert kann nicht null sein. P arameter name: controllerContext ". Ich nehme an, dass die UpdateModel
die System.Web.Mvc.ControllerContext
erfordert, die während der Ausführung des Tests nicht vorhanden ist.
Ich gehe auch davon aus, dass ich irgendwo etwas falsch mache und nur in die richtige Richtung zeigen muss.
Hilfe bitte!
Ich stimme zu, ich könnte dies durch Mocking lösen, aber das geht explizit gegen das, was Scott in seinem Beitrag in Bezug auf die UpdateModel Beispiele sagt: "Wir mussten nichts zu Unit-Test beide der oben genannten Formular Vorlage Szenarien verspotten. " –
Ich schaute auf die Quelle für TryUpdateModel (die UpdateModel verwendet) und es verwendet definitiv den ControllerContext. Ich habe meine Antwort mit dem entsprechenden Quellcode-Bit aktualisiert. – tvanfosson
@Hellfire, Ich sah einen Kommentar auf dem Blog-Post, der darauf hinweist, dass mindestens eine andere Person den gleichen Fehler hatte. Möglicherweise hat sich ModelBindingContext geändert, bevor Beta 1 aus der Tür kam. – tvanfosson