Sto provando a scrivere un test unitario per il mio controller per verificare se una vista è stata restituita correttamente, ma questo controller ha un controller di base che accede a HttpContext.Current.Session. Ogni volta che creo una nuova istanza del mio controller, richiama il costruttore di basecontroller e il test fallisce con un'eccezione di puntatore nullo su HttpContext.Current.Session. Ecco il codice:Test controller unità ASP.NET MVC con HttpContext
public class BaseController : Controller
{
protected BaseController()
{
ViewData["UserID"] = HttpContext.Current.Session["UserID"];
}
}
public class IndexController : BaseController
{
public ActionResult Index()
{
return View("Index.aspx");
}
}
[TestMethod]
public void Retrieve_IndexTest()
{
// Arrange
const string expectedViewName = "Index";
IndexController controller = new IndexController();
// Act
var result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result, "Should have returned a ViewResult");
Assert.AreEqual(expectedViewName, result.ViewName, "View name should have been {0}", expectedViewName);
}
Delle idee su come prendere in giro (con MOQ) la sessione a cui si accede al controller di base quindi il test nel controller discendente verrà eseguito?
Se uso il metodo del filtro azione che avrebbero allora per decorare ogni azione con questo attributo e con circa 400 azioni che ISN 'fattibile – amurra
@ user299592: No, non lo faresti. Puoi applicarlo a livello di classe (come nell'esempio) e lo applicherà a ogni azione in quella classe. Se pensi che sarà più impegnativo che prendere in giro un contesto per ogni test su ogni azione (pochi o nessuno dei quali effettivamente usa il campo che stai impostando nel costruttore), abbastanza equo. – pdr
Il tuo corretto non l'ho visto a livello di classe, ma non sarebbe ancora chiamato il filtro di azione durante l'istanziazione dell'oggetto controller? – amurra