RSpec - 在请求规范中模拟私有 class 方法调用?

RSpec - mock a private class method call inside a request spec?

这是我的class

class MyClass

  def run

    to_be_mocked("arg")

    ## etc

  end

  private

  def to_be_mocked(arg)
    # implementation
  end

end

我的控制器,也就是我正在为其编写请求规范的对象,称之为 class。 这是我的要求规格:

  context "Some context" do
    context "some sub context" do
      before :each do
        allow(MyClass). to receive(: to_be_mocked).with(account.url).and_return(false)
      end
      it "responds with a 200" do
        do_request
        expect(JSON.parse(response.body)["field"]).to eq true
        expect(response.status).to eq 200
      end
    end

但是我的模拟失败了 MyClass does not implement: to_be_mocked

已经尝试删除 private 关键字,但得到了相同的结果。

我在这里错过了什么?

您在嘲笑 class,这就是您嘲笑“静态”class-level 方法的方式。例如,如果您的方法是 def self.foo 并且您通过 MyClass.foo 调用它,那么 allow(MyClass) 就是正确的选择。

您的方法不是 class-level 方法,它是一个实例方法。您通过首先创建一个而不是 MyClass 然后调用该实例上的方法来调用它。您需要使用 allow_any_instance_of 模拟 class:

所有未来实例的方法
allow_any_instance_of(MyClass).to receive(....)