Могу ли я переопределить метод в RSpec только для одного вызова аргумента - PullRequest
3 голосов
/ 23 марта 2012

У меня есть механизм включения функций в нескольких проектах (один с использованием RSpec 1 с Rails 2, а другой с RSpec 2 / Rails 3), и я ищу лучший способ переопределить только одну функцию безчто-то делать с другими функциями.В конечном итоге я ищу способ заглушить метод, когда он вызывается с определенным аргументом, и вести себя нормально в противном случае.

Закрыть:

Project::Config.should_receive(:feature_enabled?).with('new_feature').any_number_of_times.and_return(true)
get :index # calls feature_enabled? for a few other features too

>> <Project::Config (class)> expected feature_enabled? with 'new_feature' but received it with 'some old feature'

Работает, но я ищучто-то немного чище, особенно в тех случаях, когда может быть несколько блоков {} на разных уровнях, включающих различные функции.

Project::Config.should_receive(:feature_enabled?).with('new_feature').any_number_of_times.and_return(true)
# expect any other calls
Project::Config.should_receive(:feature_enabled?).any_number_of_times
# I can't override any features here.  This is annoying if I try to set up expectations at a few different levels
get :index # might call feature_enabled? for a few features

Это также не срабатывает:

Project::Config.stub(:feature_enabled?).with('new_feature').and_return(true)
get :index

>> undefined method `feature_enabled?' for Project::Config:Class

В идеале ябыть в состоянии сделать что-то в одной строке, что не влияет на другие feature_enabled?звонки.Если есть что-то, что просто работает для RSpec2, это нормально, так как мы обновим другой проект в какой-то момент.

1 Ответ

3 голосов
/ 26 апреля 2012

Лучшее решение, которое я нашел для обращения к оригинальному методу, работает следующим образом:

method = Project::Config.method(:feature_enabled?)

Project::Config.stub(:feature_enabled?).and_return do |arg|
  method.call(arg)
end

Project::Config.should_receive(:feature_enabled?).with('new_feature').and_return(true)
...