2008-10-02 5 views
10

Ich möchte nur fragen, was wäre besser Ansatz, um diese Objekte in meinen Komponententests zu liefern.Mock IIdentity und IPrincipal

In meinem Komponententest teste ich CSLA-Objekt. Das CSLA-Objekt verwendet intern eine Eigenschaft und eine Methode des ApplicationUser-Objekts. ApplicationUser wird von IPrincipal geerbt. Die Eigenschaften sind: 1) ApplicationContext.User.IsInRole (...) - die Methode ist Teil von IPrincipal 2) ApplicationContext.User.Identity.Name - der Name ist eine Eigenschaft von IIdentität, die Teil von ApplicationUser aka IPriccal

ist

Beispiel meines Tests (mit RhinoMock):

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 
    } 
} 

ich habe kleines Problem mit dem zweiten Wert, die Identität Namen. Ich habe versucht, es zu verspotten, habe aber Probleme, ApplicationUser mit verspotteten Identity zu versehen, wie es intern gemacht wird. Mir wurde gesagt, ich sollte nur einige IIPrincipal (einschließlich IIdentity) selbst erstellen und es überhaupt nicht verspotten. Was kann man sicher machen? Nicht sicher, ob dies als Stub verwendet werden kann?

Also können Sie mir Ratschläge geben, wie Sie mit IPrincipal und IIdentity umgehen? Jeder Vorschlag ist sehr willkommen.

Antwort

10

Der Grund, warum Sie einen Nullreferenzfehler erhalten, ist, weil IPrincipal.Identity null ist; Es wurde noch nicht in Ihrem verspotteten IPrincipal festgelegt. Der Aufruf .Name der Null Identity führt zu Ihrer Ausnahme.

Die Antwort, wie Carlton wies darauf hin, ist IIdentityauch, zu verspotten und es bis zurückzukehren „ju“ für seine Name Eigenschaft. Dann können Sie IPrincipal.Identity sagen, um den Schein IIdentity zurückzugeben. Hier

ist eine Erweiterung des Codes, dies zu tun (mit Rhino Mocks statt Stubs):

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); 
    } 
} 
+1

'CreateMock' ist veraltet. Verwenden Sie stattdessen "StrictMock" oder "DynamicMock". – Padhraic

4

Hier ist der Code verwende ich einen Testbenutzer (mit Stubs) zurückzukehren:

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

ich Linq in anderen Code haben, so dass die Variablen die var Typ für Ich verwende; Ersetzen Sie einfach die richtigen Typen (IPrincipal, IIdentity), falls erforderlich.

Verwandte Themen