Как заставить instance_of работать с объектами ActiveRecord в RoR? - PullRequest
1 голос
/ 02 марта 2010

Сегодня я столкнулся с проблемой использования RoR для блокировки вызовов AR-объектов. Я думал, что смогу сделать что-то вроде:

stub.instance_of(BankAccount).save_to_other_spot { true }

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

Итак, я использовал следующий метод:

stub.proxy(BankAccount).find(anything) do |account|
  stub(account).save_to_other_spot { true }
  account
end

Это работает.

Мне было интересно, делаю ли я что-то не так? Почему instance_of не работает так, как я ожидаю?

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

Под этим я подразумеваю, что мне нужно сделать что-то вроде:

... mock and stub ...
get :show, :id => @id

... mock and stub ...
post :update, :id => id, :account => { ... params ... }

Я думал, что смогу посмеяться и заглушить один раз наверху.

1 Ответ

1 голос
/ 16 сентября 2011

Если вы используете RSpec> 2.5 ..., синтаксис макета / заглушки был улучшен, так что теперь вы можете использовать следующее определение.

BankAccount.any_instance.stub(:save_to_other_spot) { true }

Обратите внимание, что вам нужно будет использовать более позднюю версию RSpec . Более ранние версии RSpec не включают метод any_instance. Похоже, что они позаимствовали это у Mocha и внедрили его в макеты RSpec.

Если вы используете более старые версии RSpec, то то, что вы делаете, я думаю, является единственным способом. Только то, что я склонен писать так:

@bank_account = BankAccount.new
BankAccount.stub(:find) { @bank_account }
@bank_account.stub(:save_to_other_spot) { true }

Хотя я думаю, что ваш блочный метод выглядит чище.

...