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(....)
这是我的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(....)