/ / No RSpec, qual é a diferença entre uma expectativa de mensagem (recebimento) e um espião de teste (have_received)? - ruby-on-rails, testing, rspec, mocking

No RSpec, qual é a diferença entre uma expectativa de mensagem (recebimento) e um espião de teste (have_received)? - rubi-on-rails, testes, rspec, zombaria

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 № 1

As 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