Question

Salut, je suis en train de tester l'unité de mon action sur mon contrôleur fermeture de session, mais j'ai des moments difficiles à tester ou STUB ma session dans le HttpContext. J'utilise MVC Contrib TestHelper pour le rendre plus facile mais maintenant je besoin d'un peu d'aide.

Voici mon test:

[TestFixture]
    public class SessionControllerTest
    {
        private ISession _session;
        private IConfigHelper _configHelper;
        private IAuthenticationService _authService;
        //private IMailHelper _mailHelper;
        private ICryptographer _crypto;
        private SessionController _controller;
        private TestControllerBuilder _builder;
        private MockRepository _mock;
    [SetUp]
    public void Setup()
    {
        _mock = new MockRepository();
        _session = _mock.DynamicMock<ISession>();
        _configHelper = _mock.DynamicMock<IConfigHelper>();
        _authService = _mock.DynamicMock<IAuthenticationService>();
        //_mailHelper = _mock.DynamicMock<IMailHelper>();
        _crypto = _mock.DynamicMock<ICryptographer>();
        _controller = new SessionController(_authService, _session, _crypto, _configHelper);
        _builder = new TestControllerBuilder();
        _builder.InitializeController(_controller);
    }
[Test]
        public void Logout_ReturnRedirectToAction()
        {
        _builder.InitializeController(_controller);

        _authService.SignOut();
        LastCall.Repeat.Once();
        _builder.Session["memberNumber"] = string.Empty;
        LastCall.Repeat.Once();
        _controller.Session.Clear();
        LastCall.Repeat.Any();
        _controller.Session.Abandon();
        LastCall.Repeat.Any();
        //_builder.Session.Stub(s => s.Clear());
        //_builder.Session.Stub(s => s.Abandon());
        //_builder.Session.Clear();
        //LastCall.Repeat.Once();
        //_builder.Session.Abandon();
        //LastCall.Repeat.Once();

        _mock.ReplayAll();
        var result = _controller.Logout();

        _mock.VerifyAll();
        result.AssertActionRedirect().ToAction<SessionController>(c => c.Login());
    }

Vous pouvez voir mes différents attemps. Je reçois une erreur me disant que Session.Abandon () ne sont pas mis en œuvre, sorcière est juste quand vous jetez un oeil à TestHelper de MvcContrib. Mais comment puis-je railler ou Stub la session qui est déjà moqué par le TestHelper?

L'exception dans NUnit:

  

System.NotImplementedException: La   Procédé ou utilisation ne sont pas   mis en œuvre. à   MvcContrib.TestHelper.MockSession.Abandon ()

Merci pour l'aide!

EDIT: Voici le nouveau test de travail

[Test]
    public void Logout_ReturnRedirectToAction()
    {
        _builder.InitializeController(_controller);
        var mockSession = _mock.Stub<HttpSessionStateBase>();

        _controller.HttpContext.BackToRecord();
        _controller.HttpContext.Stub(c => c.Session).Return(mockSession);
        _controller.HttpContext.Replay();

        _authService.SignOut();
        LastCall.Repeat.Once();
        _builder.Session["memberNumber"] = string.Empty;
        _controller.Session.Clear();
        LastCall.Repeat.Once();
        _controller.Session.Abandon();
        LastCall.Repeat.Once();

        _mock.ReplayAll();
        var result = _controller.Logout();

        _mock.VerifyAll();
        result.AssertActionRedirect().ToAction<SessionController>(c => c.Login());
    }
Était-ce utile?

La solution

Il a été un moment que je MvcContrib, donc je tiré vers le bas le dernier code et a fait un projet de test rapide. Il est très étrange. En regardant le code MvcContrib (en particulier, TestControllerBuilder), il crée des simulacres pour la plupart des objets (demande, réponse, serveur, etc ...), mais pas pour la session. Je ne sais pas pourquoi il en est - ont probablement demander aux créateurs

.

Cependant, il y a une façon de le railler vous. Vous pouvez créer votre propre simulation de session et de dire au contrôleur d'utiliser le vôtre au lieu de celui de MvcContrib.TestHelpers. Voici ce que je l'ai fait dans mon test:

var mockSession = MockRepository.GenerateStub<HttpSessionStateBase>();
controller.HttpContext.BackToRecord();
controller.HttpContext.Stub(c => c.Session).Return(mockSession);
controller.HttpContext.Replay();

Maintenant, je lance ma méthode du contrôleur, puis utiliser la syntaxe AAA de Rhino.Mocks pour se assurer que la méthode a été appelée Abandonner:

controller.Session.AssertWasCalled(s => s.Abandon());

Si vous voulez utiliser la sémantique enregistrement / lecture, vous pouvez définir vos attentes avant d'appeler controller.HttpContext.Replay().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top