带有模拟静态方法和非静态方法的 Rspec 测试

Gab*_*ita 6 unit-testing rspec ruby-on-rails mocking

我有一个这样的方法:

def self.method
  #API CALL
end
Run Code Online (Sandbox Code Playgroud)

我正在为调用此静态方法的控制器方法编写测试。它是这样的:

it 'update order to confirmed' do
    Order.should_receive(:process_payment).and_return({})
    sign_in user
    attributes = FactoryGirl.attributes_for(:order, :valid_order)
    patch :confirm_order, params: { id: order.id, order: attributes }
    order.reload
    expect(order.confirmed).to eq true
end
Run Code Online (Sandbox Code Playgroud)

它工作正常。但是我不得不使这个方法不是静态的,并且测试开始失败。

在我的控制器中,我现在正在调用这样的方法:

Order.new.process_payment(@order)
Run Code Online (Sandbox Code Playgroud)

我猜问题出在我的模拟上,但我不知道如何解决它。关于如何使我的模拟适应这种新格式的任何想法?

Igo*_*dov 5

您可以使用allow_any_instance_of方法:

allow_any_instance_of(Order).to receive(:process_payment).and_return({})
Run Code Online (Sandbox Code Playgroud)

  • `allow_any_instance_of` [已弃用](https://relishapp.com/rspec/rspec-mocks/v/3-3/docs/old-syntax/any-instance) 并应替换为 `allow`。[此处](https://relishapp.com/rspec/rspec-mocks/v/3-3/docs/basics/allowing-messages)是一些示例 (2认同)