2009-11-23 2 views
9

я в настоящее время есть некоторые ожидания, установленные на макете с последовательными вызовами:RSpec: Ожидая сообщение несколько раз, но с различными параметрами

Спецификация:

@my_mock = mock("a_mock") 
@options1 = {:some => "option"} 
@options2 = {:some_other => "option"} 
@first_param = mock("first_param") 

@my_mock.should_receive(:a_message).with(@first_param, @options1) 
@my_mock.should_receive(:a_message).with(@first_param, @options2) 

Однако, я получаю следующее:

Mock "a_mock" received :a_message with unexpected arguments 
    expected: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param"{:some => "option"}) 
    got: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param">, {:some_other => "option"}) 

Когда я отлаживаю это, вызывается первое ожидание. Должен ли я указывать что-либо еще, прежде чем я смогу ожидать последовательных вызовов с тем же сообщением, но с разными параметрами?

+0

Когда я попробую ваш пример, он отлично работает для меня. Какую версию Ruby и RSpec вы используете? –

ответ

9

Попробуйте создать свой макет как нулевой объект, чтобы игнорировать дополнительные вызовы методов. Каждое из ваших ожиданий должно быть выполнено, но они не будут наступать друг на друга.

@my_mock = mock("a_mock").as_null_object 

Это следует Null Object шаблон, в котором любые посторонние сообщения, просто игнорируются. Это полезно с помощью mocks, когда вы хотите удостовериться, что метод вызван с определенными параметрами, но вам все равно, вызвано ли оно другими параметрами или вызываются какие-либо другие методы.

+0

Это помогает. Однако я не уверен, что это делает. Вы можете объяснить? – manlycode

+0

Я обновил свой ответ с небольшой дополнительной информацией о нулевых объектах. Я не образец или эксперт по тестированию, но я надеюсь, что это поможет. – Baldu

Смежные вопросы