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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top