2016-07-25 11 views
1

Ich habe unter Fehler erhalten.Wie schreibe ich Komponententests in C# Mvc? Methode haben Sitzungen

„Eine Ausnahme des Typs‚System.NullReferenceException‘traten bei Effort Estimation.dll wurde aber in Benutzercode Zusätzliche Informationen, die nicht behandelt. Objektverweis nicht auf eine Instanz eines Objekts“

Im Controller habe ich eine Methode namens Login. In dieser Methode verwenden wir Sitzung. Wie schreibt man Unit-Tests? Während der Unit-Test-Code ausgeführt wird, wird der Haupt-Csharp-Code aufgerufen und in die Methode aufgenommen und in den Session-Deklarationen gestoppt. Jeder, wenn Sie die Lösung kennen, lösen Sie es so bald wie möglich.

Mein Unit Test Code, was ich versucht habe ist, LoginModel Klasse haben 2 Variablen, die ich dort zugewiesen habe.

[TestMethod] 
public void Login1() //Bug 
{ 
    LoginController log = new LoginController(); 
    LoginModel logModel = new LoginModel(); 
    logModel.UserName = "20079199"; 
    logModel.Password = "123456"; 
    var result = log.Login(logModel) as ViewResult; 
    Assert.AreEqual("HomePage", result); 

} 

[HttpPost] 
public ActionResult Login(LoginModel lVM) 
{ 
    LoginViewModel model = UM.Authentication(lVM); 
    if (model.UserId > 0) 
    { 
     Session["LoginMessage"] = model.UserName; 
     Session["UserID"] = model.UserId; 

     IDataHelper ex = new DataHelper(); 

     return RedirectToAction("HomePage", "Newcontroller"); 
    } 
    else 
    { 
     Session["LoginMessage"] = "Invalid UserName and Password"; 
     return RedirectToAction("Login", "Login"); 
    } 
} 
+5

http://stackoverflow.com/questions/9624242/setting-httpcontext- current-session-in-unit-test –

+0

Ich würde sagen: Warum wollen Sie diese Methode testen? Ich persönlich würde mich nicht darum kümmern. Dennoch, der Link von Eddie Paz beantwortet Ihre Frage. –

+0

@ A.Chiesa - Mein TL hat mir gesagt, dass ich alle Methoden im Controller testen soll. Führen Sie den Komponententest aus, der bei der Methode im Controller einen Fehler anzeigt. das ist "Null Referenz Ausnahme. Objektreferenz nicht eine Instanz eines Objekts gesetzt" – Param

Antwort

2

Ich glaube, Sie haben drei Möglichkeiten hier:

1) Verwenden Sie die Httpcontextbase und verspotten, was Sie in der Steuerung müssen

2) Erstellen Sie eine überprüfbare LoginController, die von LoginController erbt z.B.

public class TestAbleLoginController : LoginController{}

Sobald Sie dies tun, den Code wickelt, die die Sitzung in einem neuen Verfahren setzt und dann diese Methode in dem prüfbaren Controller außer Kraft setzen, damit es nicht die Sitzung nicht einstellen, wenn Sie es nicht brauchen.

z.B.

protected internal override SetLoginInfo(){ //do nothing}

Während der eigentliche Code tut

protected virtual SetLoginInfo(){ Session["LoginMessage"]...} 

3) den Code Wickeln Sie die Sitzung in einem anderen Objekt zuzugreifen und diese über den Konstruktor zu injizieren in. So könnte man eine Schnittstelle wie IUserSession mit definieren, was Sie brauchen dann nur diese Schnittstelle in Ihrem Test verspotten, so dass es nichts tut wie

var userSession = MockRepository.GenerateStub<IUserSession>(); 
+0

Können Sie mehr über Schritt 2, vielleicht mehr Codebeispiel, erzählen? –

Verwandte Themen