Dentro RSpec (especificamente rspec-mocks), qual é a diferença entre Expectativas de mensagem e Test Spies? Eles parecem semelhantes e aparecem lado a lado como seções separadas no leia-me.
ou seja, qual é a diferença entre:
expect(validator).to receive(:validate) # message expectation
e
expect(validator).to have_received(:validate) # test spy
Respostas:
6 para resposta № 1As expectativas da mensagem podem ser definidas em qualquer objeto e representam uma declaração de que algo vai acontecer (ou não acontecer) a esse objeto no futuro. Se a expectativa for violada duranteexecução de teste subsequente, o teste falhará no momento em que ocorre a violação. Se a expectativa não tiver sido atendida ao final do teste, o teste também falhará.
o have_received
família de métodos só funciona em duplas de teste e examina o que aconteceu com as duplas no passado, desde o momento da criação do duplo atépor meio da chamada de método atual. Ele é bem-sucedido ou falha nesse ponto no tempo. O termo "espião de teste" é um pouco enganador, porque o suporte para esse mecanismo retroativo é uma parte padrão dos rspec-mocks neste ponto. Você não faz nada de "especial" para criar um "espião de teste".
3 para resposta № 2
Nem sempre você pode usar espiões ao fazer o teste, basicamente para as expectativas das aulas.
Exemplo:
expect(User).to receive(:new)
não há como fazer isso com um espião (a menos que você faça injeção de dependência).
Agora, você pode fazer o seguinte:
user = double("user", save: true)
expect(User).to receive(:new).and_return user
User.new.save
expect(user).to have_received(:save)
Você vê claramente que:
você tem que definir expectativas sobre o objeto real antes de executar o código real (parece estranho definir expectativas antes de acionar o código)
você pode definir a expectativa de espiões após o código real, o que é mais natural