ruby-on-rails - receive - rspec stub class method




RSpec: Нулевые цепи с аргументами? (2)

Вы можете использовать вложенный блок-заглушку. Блок может принимать аргументы, а возвращаемое значение используется как возвращаемое значение функции.

Я использую tap потому что stub не возвращает вызываемого абонента. Макет, созданный с помощью double , возвращается в результате order метода, который, where метод снова заглушается.

Payment.stub(:order) { |order|
  double('ordered_payments').tap { |proxy|
    proxy.stub(:where) { |where|
      [order, where]
    }
  }
}

Payment.order(:updated_at).where(:paid => true)
# => returns [:updated_at, {:paid => true}]

Просто интересно, если / как аргументы могут быть переданы в цепях rspec. Чтобы привести пример, предположим, что у меня есть следующее действие:

def index
  @payments = Payment.order(:updated_at).where(:paid => true)
  @bad_payments = Payment.order(:some_other_field).where(:paid => false)
end

В моей спецификации контроллера я хотел бы иметь возможность вырезать оба метода и возвращать разные результаты. Если в @payments поле @payments я бы использовал что-то вроде

Payment.stub_chain(:order, :where) { return_this }

Но, конечно, это вернет то же значение для @bad_payments .

Итак - короче говоря, как включить в качестве заглушек условия :updated_at и :paid => true ?


Вы можете использовать это:

Payment.stub_chain(:order, :where).with(:updated_at).with(:paid => true) { return_this }






stub