J'ai commencé avec le MVCMockHelper de Scott Hanselman, ajouté une petite classe et apporté les modifications ci-dessous pour permettre au contrôleur d'utiliser la Session normalement et au test unitaire de vérifier les valeurs qui ont été définies par le contrôleur.
///
/// Une classe permettant de simuler un objet Session
///
public class MockHttpSession : HttpSessionStateBase
{
Dictionary m_SessionStorage = new Dictionary();
public override object this[string name]
{
get { return m_SessionStorage[name]; }
set { m_SessionStorage[name] = value; }
}
}
//Dans MVCMockHelpers, j'ai modifié la méthode FakeHttpContext() comme indiqué ci-dessous
public static HttpContextBase FakeHttpContext()
{
var context = new Mock();
var request = new Mock();
var response = new Mock();
var session = new MockHttpSession();
var server = new Mock();
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session);
context.Setup(ctx => ctx.Server).Returns(server.Object);
return context.Object;
}
//Maintenant dans le test unitaire, je peux faire
AccountController acct = new AccountController();
acct.SetFakeControllerContext();
acct.SetBusinessObject(mockBO.Object);
RedirectResult results = (RedirectResult)acct.LogOn(userName, password, rememberMe, returnUrl);
Assert.AreEqual(returnUrl, results.Url);
Assert.AreEqual(userName, acct.Session["txtUserName"]);
Assert.IsNotNull(acct.Session["SessionGUID"]);
Ce n'est pas parfait mais ça suffit pour les tests.