مشكلة MVCContrib TestHelper مع Session.clear و Session.Abandon و Rhino Mock
-
25-09-2019 - |
سؤال
مرحبًا ، أنا أحاول اختبار إجراءات تسجيل الدخول الخاصة بي على وحدة التحكم الخاصة بي ، لكن لدي أوقات صعبة لاختبار أو تعبئة جلستي في 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()
.