我正试图在代码中编写一个类来包装一些RSpec调用。然而,每当我尝试访问rspec内容时,我的类根本看不到这些方法。
我在spec/support/helper.rb
中定义了以下文件
require 'rspec/mocks/standalone'
module A
class Helper
def wrap_expect(dbl, func, args, ret)
expect(dbl).to receive(func).with(args).and_return(ret)
end
end
end
我得到了一个NoMethodError: undefined method 'expect'
,尽管需要正确的模块。请注意,如果我将对rspec函数的调用放在模块之前,则可以正确地找到所有函数。
我已经尝试将以下类似内容添加到我的spec_helper.rb
:
config.requires << 'rspec/mocks/standalone'
但无济于事。
我设法在类中使用了类变量,并从全局上下文传递函数,但这种解决方案似乎相当极端。此外,我还可以通过测试上下文本身并存储它,但我也不想这样做。
expect
函数仅与rspec核心方法(如it
before
(关联。如果需要在方法内部有expect,可以尝试在辅助文件中添加Rspec matcher类。
include RSpec::Matchers
由于调用expect
的self
不是当前的rspec上下文RSpec::ExampleGroups
,因此可以通过记录self
来检查该错误
module A
class Helper
def wrap_expect(dbl, func, args, ret)
puts self
expect(dbl).to receive(func).with(args).and_return(ret)
end
end
end
# test case
A::Helper.new.wrap_expect(...) # log self: A::Helper
很明显,A::Helper不支持expect
现在您有两个选项来构建一个助手:(1(一个模块或(2(一个用当前测试用例上下文初始化的类:
(1(
module WrapHelper
def wrap_expect(...)
puts self # RSpec::ExampleGroups::...
expect(...).to receive(...)...
end
end
# test case
RSpec.describe StackOverFlow, type: :model do
include WrapHelper
it "...." do
wrap_expect(...) # call directly
end
end
(2(
class WrapHelper
def initialize(spec)
@spec = spec
end
def wrap_expect(...)
puts @spec # RSpec::ExampleGroups::...
@spec.expect(...).to @spec.receive(...)...
end
end
# test case
RSpec.describe StackOverFlow, type: :model do
let!(:helper) {WrapHelper.new(self)}
it "...." do
helper.wrap_expect(...)
end
end