Mock Ientity e iPrincipal
-
03-07-2019 - |
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.
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.