Более читаемый / понятный способ определить, следует ли ожидать ожидания перед публикацией - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть способ установить ожидания should_receive для фиктивного объекта, но мне это кажется немного странным.

def mock_fax_event(stubs={})
  @mock_fax_event ||= mock_model(FaxEvent, stubs)
end

it "should notify facility/admin of failed faxes" do
  FaxEvent.should_receive(:find_by_fax_id).with(@fax_event.fax_id).and_return(mock_fax_event(:notify_failure => true))
  mock_fax_event.should_receive(:notify_failure)
  post :create, :TransactionID => @fax_event.fax_id
end

Мне бы хотелось сделать что-то вроде следующего, но это нене работает:

it "should notify facility/admin of failed faxes" do
  post :create, :TransactionID => @fax_event.fax_id
  assigns(:fax_event).should_receive(:notify_failure)
end

Мне кажется, я понимаю, почему вышеперечисленное не работает, но я думаю, то, как я это делаю сейчас, неясно.Я также хотел бы только проверить, действительно ли вызывается notify_failure, а не часть find_by_fax_id.

Есть ли лучший способ сделать то, что я пытаюсь сделать?

1 Ответ

1 голос
/ 21 апреля 2011

Ваш второй пример не работает, потому что это проблема типа курицы и яйца.Вы устанавливаете ожидание для объекта после вызова post, что и приводит к тому, что этот объект назначается в первую очередь.И вы не можете просто поменять строки, потому что assigns не имеет ничего, что можно вернуть.

Если вас не волнует, будет ли вызван find_by_fax_id, лучшее, что вы можете сделать, это позвонить FaxEvent.stub(:find_by_fax_id).and_return(...), но это не намного лучше.

Это одна из причин, по которой мне нравится использовать Мокко .Вы можете сделать это:

FaxEvent.any_instance.expects(:notify_failure)
post :create, :TransactionID => @fax_event.fax_id

Это позволяет вам пропустить раздражающий шаг "найди мой фиктивный объект вместо того, что ты действительно найдешь".

Кроме того, :TransactionID идет против именусловности, это должно быть :transaction_id.

...