Ao escrever testes RSpec, eu me pego escrevendo uma grande quantidade de código parecido com este para garantir que um método foi chamado durante a execução de um teste (para fins de argumentação, digamos que não posso realmente interrogar o estado do objeto após a chamada porque a operação que o método executa não é fácil de ver o efeito).
describe "#foo"
it "should call 'bar' with appropriate arguments" do
called_bar = false
subject.stub(:bar).with("an argument I want") { called_bar = true }
subject.foo
expect(called_bar).to be_true
end
end
O que eu quero saber é: existe uma sintaxe melhor disponível do que esta? Estou perdendo alguma grandiosidade funky RSpec que reduziria o código acima a algumas linhas? should_receive
parece que deveria fazer isso, mas lendo mais parece que não é exatamente o que faz.
ruby-on-rails
ruby
rspec
Mikey Hogarth
fonte
fonte
should_receive
, então pensei que essa pergunta ajudaria.Respostas:
fonte
called_bar
. Isso foi apenas um sinalizador para garantir que o método foi chamado, mas comexpect(...).to receive(...)
você já está cobrindo isso. É mais claro e semânticoNa nova
rspec
expect
sintaxe, seria:fonte
O abaixo deve funcionar
Documentação: https://github.com/rspec/rspec-mocks#expecting-arguments
fonte
have_received
(a abordagem de "espiões" após o fato), nãohas_received
, o que não faz parte de nenhuma versão do RSpec que eu conheço.Para estar em total conformidade com a sintaxe RSpec ~> 3.1 e
rubocop-rspec
a opção padrão de regraRSpec/MessageSpies
, aqui está o que você pode fazer comspy
:Se você não usar rubocop-rspec ou usando a opção não padrão. Você pode, é claro, usar o padrão RSpec 3 com o expect.
fonte