Como posso adicionar várias expectativas should_receive sobre um objeto usando RSpec?
-
04-07-2019 - |
Pergunta
Na minha Rails controlador, eu estou criando várias instâncias da mesma classe de modelo. Quero acrescentar algumas expectativas RSpec para que eu possa testar se ele está criando o número correto com os parâmetros corretos. Então, aqui está o que eu tenho na minha spec:
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => @user.id, :position_id => 1, :is_leader => true) Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "2222", :position_id => 2) Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "3333", :position_id => 3) Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "4444", :position_id => 4)
Isso está causando problemas porque parece que a classe colega de banda pode ter apenas 1 set expectativa "should_receive" nele. Então, quando eu executar o exemplo, eu recebo o seguinte erro:
Spec::Mocks::MockExpectationError in 'BandsController should create all the bandmates when created' Mock 'Class' expected :create with ({:band_id=>1014, :user_id=>999, :position_id=>1, :is_leader=>true}) but received it with ({:band_id=>1014, :user_id=>"2222", :position_id=>"2"})
Esses são os parâmetros corretos para a segunda chamada para criar, mas RSpec está testando contra os parâmetros errados.
Alguém sabe como posso configurar as minhas expectativas should_receive para permitir várias chamadas diferentes?
Solução
Vários expectativas não são um problema de todos. O que você está correndo para se encomendar problemas, dado seus argumentos específicos sobre as expectativas não ordenadas. Verifique este página para obter detalhes sobre as expectativas de ordenação.
A história curta é que você deve adicionar .ordered
ao final de cada uma das suas expectativas.
Outras dicas
my_mock.should_receive (: sym) .Uma vez
my_mock.should_receive (: sym) .twice
my_mock.should_receive (: sym) .exactly (n) .times
my_mock.should_receive (: sym) .at_least (: uma vez)
my_mock.should_receive (: sym) .at_least (: duas vezes)
my_mock.should_receive (: sym) .at_least (n) .times
my_mock.should_receive (: sym) .at_most (: uma vez)
my_mock.should_receive (: sym) .at_most (: duas vezes)
my_mock.should_receive (: sym) .at_most (n) .times
my_mock.should_receive (: sym) .any_number_of_times
Obras para rspec 2.5 também.