Pergunta

Sou novo no RhinoMocks e estou tentando entender a sintaxe, além do que está acontecendo nos bastidores.

Eu tenho um objeto de usuário, vamos chamá-lo de Usuário, que possui uma propriedade chamada IsAdministrator.O valor de IsAdministrator é avaliado por meio de outra classe que verifica as permissões de segurança do usuário e retorna verdadeiro ou falso com base nessas permissões.Estou tentando zombar dessa classe User e falsificar o valor de retorno de IsAdministrator para isolar alguns testes de unidade.

Isso é o que estou fazendo até agora:

public void CreateSomethingIfUserHasAdminPermissions()
{
    User user = _mocks.StrictMock<User>();
    SetupResult.For(user.IsAdministrator).Return(true);

    // do something with my User object
} 

Agora, espero que o Rhino 'finja' a chamada para o getter de propriedade e simplesmente retorne verdadeiro para mim.Isso está incorreto?Atualmente estou recebendo uma exceção devido a dependências na propriedade IsAdministrator.

Alguém pode explicar como posso atingir meu objetivo aqui?

Foi útil?

Solução

Uma nota rápida antes de começar.Normalmente você deseja evitar o uso de uma simulação "Estrita" porque isso torna o teste frágil.Uma simulação estrita lançará uma exceção se ocorrer algo que você não informou explicitamente ao Rhino que acontecerá.Além disso, acho que você pode estar entendendo mal exatamente o que o Rhino está fazendo quando faz uma ligação para criar uma simulação.Pense nisso como um Object personalizado que foi derivado ou implementa o System.Type que você definiu.Se você mesmo fizesse isso, ficaria assim:

public class FakeUserType: User
{
    //overriding code here
}

Como IsAdministrator é provavelmente apenas uma propriedade pública no tipo User, você não pode substituí-la no tipo herdado.

No que diz respeito à sua pergunta, existem várias maneiras de lidar com isso.Você poderia implementar IsAdministrator como uma propriedade virtual em sua classe de usuário como Aaron Jensen mencionado a seguir:

public class User
{
    public virtual Boolean IsAdministrator { get; set; }
}

Esta é uma abordagem correta, mas somente se você planeja herdar de sua classe User.Além disso, se você não quiser falsificar outros membros desta classe, eles também deverão ser virtuais, o que provavelmente não é o comportamento desejado.

Outra maneira de conseguir isso é através do uso de interfaces.Se for realmente a classe User que você deseja simular, eu extrairia uma interface dela.Seu exemplo acima seria mais ou menos assim:

public interface IUser
{
    Boolean IsAdministrator { get; }
}

public class User : IUser
{
    private UserSecurity _userSecurity = new UserSecurity();

    public Boolean IsAdministrator
    {
        get { return _userSecurity.HasAccess("AdminPermissions"); }
    }
}

public void CreateSomethingIfUserHasAdminPermissions()
{
    IUser user = _mocks.StrictMock<IUser>();
    SetupResult.For(user.IsAdministrator).Return(true);

    // do something with my User object
}

Você pode ficar mais sofisticado se quiser usando injeção de dependência e IOC mas o princípio básico é o mesmo em todos os aspectos.Normalmente você deseja que suas classes dependam de interfaces em vez de implementações concretas.

Eu espero que isso ajude.Eu uso o RhinoMocks há muito tempo em um grande projeto, então não hesite em me fazer perguntas sobre TDD e zombaria.

Outras dicas

Certifique-se de que IsAdministrator seja virtual.

Além disso, certifique-se de chamar _mocks.ReplayAll()

_mocks.ReplayAll() não fará nada.É só porque você usa SetupResult.For() que não conta.Use Expect.Call() para ter certeza de que seu código está fazendo tudo correto.

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