从不同的文件调用rspec方法



我正试图在代码中编写一个类来包装一些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核心方法(如itbefore(关联。如果需要在方法内部有expect,可以尝试在辅助文件中添加Rspec matcher类。

include RSpec::Matchers

由于调用expectself不是当前的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

相关内容

  • 没有找到相关文章

最新更新