سؤال

أريد فقط أن أسأل ما هو أفضل طريقة لتزويد هذه الكائنات في اختبارات وحدتي.

في اختبار الوحدة الخاص بي ، أختبر كائن CSLA. كائن CSLA داخليًا باستخدام خاصية واحدة وطريقة واحدة لكائن ApplicationUser. Application application ورثت من iPrincipal. الخصائص هي: 1) ApplicationContext.user.isinrole (...) - الطريقة جزء من iPrincipal 2) ApplicationContext.user.identity.name - اسم خاصية iidentity التي هي جزء من ApplicationUser الملقب IKEpricial

مثال على الاختبار (باستخدام رينوموك):

public void BeforeTest()
{
   mocks = new MockRepository();
   IPrincipal mockPrincipal = mocks.CreateMock<IPrincipal>();
   ApplicationContext.User = mockPrincipal;
   using (mocks.Record()) {
      Expect.Call(mockPrincipal.IsInRole(Roles.ROLE_MAN_PERSON)).Return(true);
      Expect.Call(mockPrincipal.Identity.Name).Return("ju"); //doesn't work!!!! return null ref exc
   }
}

لدي مشكلة بسيطة مع القيمة الثانية ، اسم الهوية. حاولت السخرية من ذلك ولكن لدي مشكلة لتعيين iidentity السخرية إلى Applicationuser ، حيث يتم Internaly. قيل لي أن أخلق بعض iiprincipal (بما في ذلك iidentity) بنفسي وعدم السخرية من ذلك على الإطلاق. والتي يمكن القيام بها بالتأكيد. لست متأكدًا مما إذا كان يمكن استدعاء هذا على أنه كعب باستخدام؟

هل يمكنك أن تنصحني بكيفية التعامل مع iPrincipal و iidentity؟ أي اقتراح أكثر ترحيبا.

هل كانت مفيدة؟

المحلول

السبب في حصولك على خطأ مرجعي فارغ هو بسبب IPrincipal.Identity باطل؛ لم يتم تعيينه في سخرتك IPrincipal حتى الآن. الدعوة .Name الخالية Identity ينتج عن استثناءك.

الجواب ، كما أوضح كارلتون ، هو السخرية IIdentity ايضا, ، وقم بإعداده لإرجاع "جو" Name منشأه. ثم يمكنك أن تقول IPrincipal.Identity لإعادة وهمية IIdentity.

فيما يلي توسيع من الكود الخاص بك للقيام بذلك (باستخدام نماذج وحيد القرن بدلاً من كبار السن):

public void BeforeTest()
{
   mocks = new MockRepository();
   IPrincipal mockPrincipal = mocks.CreateMock<IPrincipal>();
   IIdentity mockIdentity = mocks.CreateMock<IIdentity>();
   ApplicationContext.User = mockPrincipal;
   using (mocks.Record()) 
   {
      Expect.Call(mockPrincipal.IsInRole(Roles.ROLE_MAN_PERSON)).Return(true);
      Expect.Call(mockIdentity.Name).Return("ju"); 
      Expect.Call(mockPrincipal.Identity).Return(mockIdentity);
   }
}

نصائح أخرى

فيما يلي الرمز الذي أستخدمه لإرجاع مستخدم اختبار (باستخدام Stubs):

    [SetUp]
    public void Setup()
    {
        var identity = MockRepository.GenerateStub<IIdentity>();
        identity.Stub(p => p.Name).Return("TestUser").Repeat.Any();
        var principal = MockRepository.GenerateStub<IPrincipal>();
        principal.Stub(p => p.Identity).Return(identity).Repeat.Any();

        Thread.CurrentPrincipal = principal;
    }

لقد حصلت على LINQ في رمز آخر ، لذا فأنا أستخدم نوع var للمتغيرات ؛ ما عليك سوى استبدال الأنواع الصحيحة (iPrincipal ، iidentity) إذا لزم الأمر.

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