RoR / RSpec - Gem的帮助程序测试无法访问ApplicationController中定义的辅助方法

时间:2014-09-24 19:02:28

标签: ruby-on-rails ruby ruby-on-rails-3 rspec gem

所以我的设置是我的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

我得到的行为与我最初的问题相同。我现在很困惑:/

1 个答案:

答案 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而失败。