所以我的设置是我的Rails应用程序使用了我正在开发的某个gem。现在我正在为RSpec的宝石助手写一些单元测试。 gem不能自行运行并由我的应用程序加载,因此在测试时它由一个“虚拟”应用程序加载,该应用程序将应用程序提供的许多功能复制到gem。
我的gem助手中的一个方法调用我的(虚拟)应用程序的ApplicationController中定义的辅助方法,如下所示:
gem中的方法:
module MyGem::ApplicationHelper
...
def method_to_test()
#do stuff
x()
#do other stuff
end
...
end
以下是如何为该方法构建测试:
describe MyGem::ApplicationHelper do
...
describe "#method_to_test()" do
it "should do x" do
expect( method_to_test() ).to do_stuff
end
end
...
end
这是(虚拟)应用程序中的方法:
class ApplicationController < ActionController::Base
...
helper_method :x
def x()
# do stuff
end
...
end
问题是当我运行测试时,我收到以下错误:
NoMethod error: undefined method 'x' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_7:0x24ef2645>
我尝试使用以下方法存根:
ApplicationController.any_instance.stub(:x)
但我仍然得到同样的错误。我做了更多的故障排除,但我能想到的唯一想法是,首先没有RSpec加载包含帮助方法的ApplicationController。
编辑:我发现我甚至无法使用我正在处理的同一个帮助程序存根方法,例如。
module MyGem::ApplicationHelper
...
def method2()
#do stuff
end
def method1()
#do stuff
method2()
#do other stuff
end
...
end
如果我在测试中写这个:
describe MyGem::ApplicationHelper do
...
describe "#method1()" do
it "should do x" do
helper.stub(:method2).and_return(false)
#or:
helper.should_receive(:method2).and_return(false)
expect( method1() ).to do_stuff
end
end
...
end
我得到的行为与我最初的问题相同。我现在很困惑:/
答案 0 :(得分:0)
所以显然我应该用helper.
调用我的帮助方法,并使用&#39; stub&#39;在before
区块。所以不要这样做:
expect( method_to_test() ).to do_stuff
我应该这样做:
expect( helper.method_to_test() ).to do_stuff
在测试before
块中使用此功能:
controller.singleton_class.class_eval do
helper_method :x
def x()
#do stuff
end
end
此外,有时我会通过将helper.method_to_test()
拉出到一个局部变量中来解决我所犯的奇怪错误:
test_result = helper.method_to_test()
expect( test_result ).to do_stuff
我不确定为什么变量&#39;技巧&#39;工作,但它确实如此,我不能抱怨!对于helper.
前缀,我认为没有它,RSpec不会从正在测试的帮助程序实例本身调用该方法。我不确定为什么它不会因NoMethodError
而失败。