سؤال

مرحبًا ، أنا أحاول اختبار إجراءات تسجيل الدخول الخاصة بي على وحدة التحكم الخاصة بي ، لكن لدي أوقات صعبة لاختبار أو تعبئة جلستي في httpcontext. أنا استخدم MVC Contrib TestHelper لتسهيل الأمر ولكن الآن أحتاج إلى القليل من المساعدة.

هذا هو الاختبار الخاص بي:

[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());
    }

يمكنك رؤية اختلاف محاولات. أحصل على خطأ يخبرني أن Session.ABANDON () لم يتم تنفيذه ، الساحرة على حق عندما تلق نظرة على TestHelper من MVCContrib. ولكن كيف يمكنني أن أسخر من الجلسة التي سخرت بالفعل من قبل testHelper؟

الاستثناء في نونيت:

System.NotimplementedException: لا يتم تنفيذ الطريقة أو العملية. في mvccontrib.testhelper.mocksession.abandon ()

شكرا للمساعدة!

تحرير: ها هو اختبار العمل الجديد

[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());
    }
هل كانت مفيدة؟

المحلول

لقد مر وقت منذ أن استخدمت MVCContrib ، لذلك قمت بسحب أحدث التعليمات البرمجية وقمت بإجراء اختبار سريع. إنه أمر غريب جدًا. بالنظر إلى رمز MVCContrib (على وجه التحديد ، TestControllerBuilder) ، فإنه ينشئ نماذج لمعظم الكائنات (الطلب ، الاستجابة ، الخادم ، إلخ ...) ، ولكن ليس للجلسة. لست متأكدًا من السبب في ذلك - ربما يجب أن تسأل المبدعين.

ومع ذلك ، هناك طريقة للسخرية من ذلك بنفسك. يمكنك إنشاء جلسة وهمية خاصة بك وإخبار وحدة التحكم باستخدامك بدلاً من تلك الموجودة في MVCContrib.testhelpers. هذا ما فعلته في اختباري:

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

الآن أقوم بتشغيل طريقة وحدة التحكم الخاصة بي ، ثم استخدم بناء جملة Rhino.Mocks 'AAA للتأكد من أن طريقة التخلي عن ما يلي:

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

إذا كنت ترغب في استخدام دلالات السجل/إعادة التشغيل ، فيمكنك ضبط توقعاتك قبل الاتصال controller.HttpContext.Replay().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top