J'essaye d'écrire un test unitaire pour mon contrôleur pour vérifier si une vue a été retournée correctement, mais ce contrôleur a un basecontroller qui accède au HttpContext.Current.Session. Chaque fois que je crée une nouvelle instance de mon contrôleur, il appelle le constructeur du basecontroller et le test échoue avec une exception de pointeur nul sur le HttpContext.Current.Session. Voici le code:Contrôleur de test unité ASP.NET MVC avec 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);
}
Toutes les idées sur la façon de se moquer (en utilisant QMC) la session qui est accessible dans le contrôleur de base de sorte que le test dans le contrôleur descendant fonctionnera?
Si j'utilise l'approche du filtre d'action que faudrait alors décorer chaque action avec cet attribut et avec environ 400 actions ISN 't possible – amurra
@ user299592: Non, vous ne le feriez pas. Vous pouvez l'appliquer au niveau de la classe (comme dans l'exemple) et l'appliquer à chaque action de cette classe. Si vous pensez que cela va être plus d'efforts que de se moquer d'un contexte pour chaque test sur chaque action (peu ou pas de qui utilisent réellement le champ que vous définissez dans le constructeur), assez juste. – pdr
Votre correct Je ne l'ai pas vu au niveau de la classe, mais le filtre d'action ne serait-il pas encore appelé lors de l'instanciation de l'objet contrôleur? – amurra