存根由包装器方法调用的 'nested' class 方法(RSpec 模拟)
Stub a 'nested' class method that is called by a wrapper method (RSpec Mocks)
情况:我想存根一个辅助方法,这样我就可以调用一个包装它的方法并取回存根响应。
代码是这样设置的:
class Thing
def self.method_one(foo)
self.method_two(foo, 'some random string')
end
def self.method_two(foo, bar)
self.method_three(foo, bar, 'no meaning')
end
def self.method_three(foo, bar, baz)
"#{foo} is #{bar} with #{baz}"
end
end
我正在尝试模拟 .method_three
以便我可以调用 .method_one
并让它最终调用 .method_three
的双倍而不是真正的交易:
it "uses the mock for .method_three" do
response_double = 'This is a different string'
thing = class_double("Thing", :method_three => response_double).as_stubbed_const
response = thing.method_one('Hi')
expect(response).to eq(response_double)
end
我遇到的错误:
RSpec::Mocks::MockExpectationError: #<ClassDouble(Thing) (anonymous)> received unexpected message :method_one with ("Hi")
我想做的事情可行吗?感觉我错过了一个明显的步骤,但尽管我尽了最大的努力,我还是没能找到这方面的例子或提出任何类似问题的问题。
(注意:如果重要,这不是 Rails 项目。)
您可能想使用 RSpec 的 allow(...)
来存根中间方法。这对于测试逻辑流程或在测试中模拟第三方服务也很有用。
例如:
expected_response = 'This is a different string'
allow(Thing).to receive(:method_three).and_return(expected_response)
然后 expect(Thing.method_one('Hi')).to eq(expected_response)
应该通过。
有关存根方法的更多信息,请参见https://relishapp.com/rspec/rspec-mocks/v/2-14/docs/method-stubs。
情况:我想存根一个辅助方法,这样我就可以调用一个包装它的方法并取回存根响应。
代码是这样设置的:
class Thing
def self.method_one(foo)
self.method_two(foo, 'some random string')
end
def self.method_two(foo, bar)
self.method_three(foo, bar, 'no meaning')
end
def self.method_three(foo, bar, baz)
"#{foo} is #{bar} with #{baz}"
end
end
我正在尝试模拟 .method_three
以便我可以调用 .method_one
并让它最终调用 .method_three
的双倍而不是真正的交易:
it "uses the mock for .method_three" do
response_double = 'This is a different string'
thing = class_double("Thing", :method_three => response_double).as_stubbed_const
response = thing.method_one('Hi')
expect(response).to eq(response_double)
end
我遇到的错误:
RSpec::Mocks::MockExpectationError: #<ClassDouble(Thing) (anonymous)> received unexpected message :method_one with ("Hi")
我想做的事情可行吗?感觉我错过了一个明显的步骤,但尽管我尽了最大的努力,我还是没能找到这方面的例子或提出任何类似问题的问题。
(注意:如果重要,这不是 Rails 项目。)
您可能想使用 RSpec 的 allow(...)
来存根中间方法。这对于测试逻辑流程或在测试中模拟第三方服务也很有用。
例如:
expected_response = 'This is a different string'
allow(Thing).to receive(:method_three).and_return(expected_response)
然后 expect(Thing.method_one('Hi')).to eq(expected_response)
应该通过。
有关存根方法的更多信息,请参见https://relishapp.com/rspec/rspec-mocks/v/2-14/docs/method-stubs。