Controller-Konstruktor aufgerufen, auf jede Anfrage
Ich versuche zum testen eine sehr einfache form, verwendet nur eine Liste und einen erstellen. Dies ist die Steuerung:
public class PositionsController : Controller
{
private readonly IPositionRepository _positions;
//default constructor
public PositionsController()
{
_positions = new TestPositionRepository();
}
//DI constructor
public PositionsController(IPositionRepository positions)
{
_positions = positions;
}
//get a list of all positions
public ActionResult Index()
{
return View(_positions.GetAllPositions());
}
//get initial create view
public ActionResult Create()
{
return View();
}
//add the new Position to the list
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Position positionToAdd)
{
try
{
_positions.AddPosition(positionToAdd);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
TestPositionRepository
ist einfach ein mock-repository habe ich erstellt, um zu testen, dependency injection. Wenn ich versuche einen neuen Eintrag erstellen, bekomme ich die zurück geschickt, um die index-Ansicht, aber der neue Eintrag wird nicht Hinzugefügt, um die Liste. Die Verwendung der debugger zeigt, dass der Konstruktor aufgerufen wird, jedes mal, wenn ich auf einen link klicken oder öffnen Sie den link in der controller-Steuerung. Gibt es eine Möglichkeit, um dieses problem zu beheben? Ich habe das Gefühl ich mache es falsch. Was ich versuche zu tun, ist dependency injection mit Ninject, aber ich bin festgefahren auf dieses problem so weit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen MockRepository werden Staatenlose in den meisten Fällen. Thats, warum werden Sie nicht sehen einen zusätzlichen Eintrag im Index. Ich würde testen, Index, und Erstellen Sie separat. Für den index würde ich nur prüfen, ob ein bestehender Eintrag wird korrekt angezeigt. Dies bedeutet, dass Ihre MockRepository sollten einige bestehende Einträge hardcoded in der es für die GetPositions - Methode.
Wenn Sie testen möchten, um die Strömung durch die Anwendung (was Erstellen + Index bereits ist) würde ich verwenden, ein integration-test auf einem echten Respository heruntergeladen werden.
Warum ist das ein problem - es ist die Art und Weise ASP.NET Anfragen arbeiten. Jede Anfrage führt Sie in seine eigene Instanz der asp.net Seite, oder die MVC-controller, und wenn die Anfrage erledigt ist, wird der controller wird verworfen - keines dieser Dinge bestehen zwischen den Anforderungen.
Somit in Ihrer create-Methode sollten Sie den Aufruf der repository-save/commit-Methode nach dem hinzufügen Ihrer neuen position.
List
mit hart-codierte Einträge. DieAddPosition
Methode wirdList.Add()
, das sollte funktionieren, aber da der controller der Konstruktor aufgerufen wird bei jeder Aktualisierung, instanziiert es ein neuesList
jeder Zeit.