No método chamado double, expectativas sobre o argumento
Pergunta
Eu criei um duplo, estou executando um código que irá chamá-lo com um método e um hash enorme como argumento, quero verificar uma chave do argumento e então retornar um hash específico.
Isso é o que estou fazendo
before :each do
allow(@my_double).to receive(:do_stuff).and_return({stuff: 42})
end
it "can do stuff" do
expect(@my_double).to receive(:do_stuff) do |arg|
expect(arg).to be_a(Hash)
expect(arg[:my_arg]).to eq(3)
end
TestObject.stuff() # will invoke do_stuff on the double
end
O que acontece é que, pela primeira vez do_stuff
é chamado, ele retorna true
que é o resultado do receive
bloco, mas nas chamadas subsequentes (testadas em pry) ele retorna corretamente {stuff: 42}
mas como a primeira chamada está errada, meu método é excluído quando tenta chamar[:stuff]
no retorno.
Estou tentando deixar allow
definir o comportamento do double então não quero colocar o retorno no final do expect
..mas há alguma maneira de contornar isso?
Solução
Descobri que a resposta é usar um ainda correspondente de argumentos não documentados hash_including
muito parecido com meu primeiro comentário
expect(@my_double).to receive(:do_stuff).with(hash_including(my_arg: 3))
Isso funciona muito bem.