Quais são as diferenças entre zombarias e stubs no Rhino Mocks?

149

Não brinquei o suficiente com isso e geralmente uso zombarias, mas me pergunto quais são as diferenças entre essas duas e quando usar uma ou outra na Rhino Mocks.

Atualizar:

Também encontrei a resposta para minha pergunta nas palavras de Ayende :

A diferença entre stubs e zombarias

Você pode obter a definição real desses termos neste artigo: Mocks are not stubs . Quero me concentrar na diferença do ponto de vista do Rhino Mocks.

Um mock é um objeto no qual podemos definir expectativas e que verificará se as ações esperadas realmente ocorreram. Um stub é um objeto que você usa para passar para o código em teste. Você pode configurar as expectativas para que ele atue de certas maneiras, mas essas expectativas nunca serão verificadas. As propriedades de um esboço se comportam automaticamente como propriedades normais e você não pode definir expectativas sobre elas.

Se você deseja verificar o comportamento do código em teste, você usará uma simulação com a expectativa apropriada e verificará isso. Se você deseja apenas passar um valor que talvez precise agir de uma certa maneira, mas não seja o foco deste teste, você utilizará um esboço.

IMPORTANTE: Um esboço nunca fará com que um teste falhe.

Rismo
fonte

Respostas:

148

De acordo com isso

... Simplificando, há uma diferença entre os objetos Mock e Stub e o RhinoMocks reconhece que nos permite escrever testes que melhor definem seu objetivo.

Objetos simulados são usados ​​para definir expectativas, ou seja: Neste cenário, espero que o método A () seja chamado com tais parâmetros. Zomba de registro e verificação de tais expectativas.

Os stubs, por outro lado, têm um objetivo diferente: eles não registram ou verificam expectativas, mas permitem "substituir" o comportamento, o estado do objeto "falso" para utilizar um cenário de teste ...

rbrayb
fonte
Encontrei outro post útil que lembra a mesma mensagem que a resposta aceita para essa pergunta - martinfowler.com/articles/mocksArentStubs.html .
precisa saber é o seguinte
20

De um modo geral, os testes de unidade chamam funções e métodos e, em seguida, verifica se o comportamento esperado ocorreu. Essas funções e métodos podem exigir parâmetros. Usamos stubs e zombarias para satisfazer esses parâmetros. Às vezes, também podemos zombar de objetos globais.

Stubs

Um Stub é um pequeno objeto falso que seu teste pode usar como parâmetro para fazer a chamada de função funcionar. Isso nos permite verificar o comportamento da função em teste. Não permite verificar efeitos colaterais, porque o stub não tem implementação.

Zombaria

Um mock é um esboço com uma implementação. Se nossa função em teste interage com nosso objeto de simulação, podemos verificar se a simulação foi interagida como esperávamos.

Por exemplo, digamos que tínhamos um objeto Usuário simulado e que queríamos verificar se nosso método session.login funcionava, talvez desejássemos verificar se user.lastLoggedIn foi definido. Poderíamos criar um usuário simulado que implementa esse método. Quando chamamos session.login, podemos afirmar que user.lastLoggedIn tem o estado esperado.

Resumindo

Um mock é um esboço com uma implementação, que permite testar efeitos colaterais.

Essa diferença ainda é importante?

Assim como a diferença entre símiles e metáforas, a diferença entre stubs e zombarias é sutil e histórica, e talvez tenha mais a ver com as diferentes comunidades e filosofias no mundo dos testes do que com qualquer diferença técnica importante.

Eles representam abordagens ligeiramente diferentes para os testes. Um mock pode ser escrito como um esboço. Um esboço geralmente pode ser expandido para uma simulação.

Qual você deve usar?

Você pode achar que começa a criar stubs e, posteriormente, pode precisar criar zombarias completas para alguns de seus objetos. Você pode zombar de tudo à medida que avança ou zombar apenas quando necessário.

superluminário
fonte
7

Diferença entre Mock e stub: com stub, você corrige a entrada do seu teste de unidade: para que seu teste de unidade não faça afirmações sobre stub e Stub, reescrevendo a implementação de algum método, conserte o comportamento de objetos falsos. com o Mock, você corrige a produção do seu teste de unidade: para que seu teste de unidade faça uma expectativa no seu objeto de zombaria, verificando a interação interna no seu objeto de simulação.

Hassan Boutougha
fonte
Parece que você está dizendo que seu teste deve "verificar" a saída de uma simulação. Se é isso que você está dizendo, você está incorreto. Um mock não deve ser testado; está lá para que você possa testar outro código. Ou sua última frase significa outra coisa?
Andrew Barber
1
Olá Andrew, como eu escrevi com o Mock, você corrige a saída do seu teste para não testá-lo. Caso contrário, eu escrevi que o Mock permite que você verifique a interação (comportamento das expectativas ... ;-)
Hassan Boutougha
1
Tá, isso faz mais sentido. Obrigado pelo esclarecimento!
Andrew Barber
> não faz asserção no stub Por que, em muitas bibliotecas de asserção, ainda existem métodos conhecidos should have been called withpara afirmar stubparâmetros.
amigos estão dizendo sobre hellboy
5

No caso da estrutura Moq - o método de instalação é STUB, enquanto o método Verify é Mock

codebased
fonte
0

Uma coisa que notei também é que, quando eu uso o MockRepository.GenerateMock, preciso definir explicitamente as expectativas em uma chamada de método específica para interceptar essa chamada. Com stubs, parece interceptar automaticamente qualquer método, desde que seja virtual.

Sean
fonte