Pergunta

Eu só quero perguntar qual seria a abordagem melhor para fornecer esses objetos nos meus testes de unidade.

No meu teste de unidade, estou testando o objeto CSLA. O objeto CSLA está usando internamente uma propriedade e um método de objeto ApplicationUser. O ApplicationUser é herdado do iPrincipal. As propriedades são: 1) ApplicationContext.User.isInRole (...) - O método faz parte do iPrincipal 2) ApplicationContext.User.Identity.Name - O nome é uma propriedade da IIDentidade, que faz parte do ApplicationUser aka ipricipal

Exemplo do meu teste (usando 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
   }
}

Tenho um pequeno problema com o segundo valor, o nome da identidade. Tentei zombar, mas tenho problemas para atribuir a Ientidade ridicularizada ao ApplicationUser, pois é feito na Internaly. Disseram -me para criar apenas um pouco de iiprincipal (incluindo a Ientidade) sozinho e para não zombar disso. O que pode ser feito com certeza. Não tenho certeza se isso pode ser chamado de stub usando?

Então você pode me aconselhar como lidar com o iPrincipal e a Ientidade? Qualquer sugestão muito bem -vinda.

Foi útil?

Solução

A razão pela qual você está recebendo um erro de referência nula é porque IPrincipal.Identity é nulo; não foi definido em seu ridicularizado IPrincipal ainda. Chamando .Name o nulo Identity resulta em sua exceção.

A resposta, como Carlton apontou, é zombar IIdentity também, e configure para retornar "Ju" para o seu Name propriedade. Então você pode dizer IPrincipal.Identity para devolver a simulação IIdentity.

Aqui está uma expansão do seu código para fazer isso (usando rinocerontes zombares em vez de 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);
   }
}

Outras dicas

Aqui está o código que eu uso para retornar um usuário de teste (usando 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;
    }

Eu tenho LINQ em outro código, por isso estou usando o tipo var para as variáveis; Basta substituir os tipos corretos (iPrincipal, Ientity), se necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top