如何测试同时定义为helper方法的ApplicationController方法?

48

我在 ApplicationController 中定义了一个方法作为帮助方法:

helper_method :some_method_here

  • 如何在 RSpec 中测试 ApplicationController ?
  • 如何在测试我的视图/帮助程序时包含 / 调用此帮助方法?

我正在使用 Rails3 和 RSpec2。

2个回答

59

您可以使用匿名控制器来测试您的ApplicationController,如RSpec文档中所述。 还有一个关于测试辅助函数的部分。

在RSpec文档中,匿名控制器 可用于测试您的ApplicationController。同样,还有一个测试助手函数的部分。


不知怎么的,我错过了那个匿名控制器!谢谢! - Mirko
正是我所需要的信息! - Matthew
2
它在Rails4中仍然有效吗?我遇到了“没有路由匹配{:controller=>"anonymous", :action => "some action"}”的问题。 - chrmod
可能是这个问题:https://github.com/rspec/rspec-rails/issues/636。匿名控制器只有默认资源方法的路由,所以将“某些操作”重命名为(比如)“索引”,或者创建一个路由。 - Andy Triggs
我也想为我想测试的每个方法创建路由,但是不幸的是我做不到。所以我只是在索引声明中调用了我想要测试的每个方法,并使用 allow(controller).to receive(:any_non_relevant_method_name).and_return(true) 为每个单独的测试挑选出非相关的方法。我以DRY的方式完成了这个过程。 - ryan2johnson9

23

您可以在规范中使用subject@controller调用您的帮助方法。

我一直在寻找解决这个问题的方法,而匿名控制器不是我想要的。假设您拥有一个控制器,它位于app/controllers/application_controller.rb,具有一个简单的方法,该方法未绑定到REST路径:

class ApplicationController < ActionController:Base

  def your_helper_method
    return 'a_helpful_string'
  end

end

然后您可以按照以下方式在spec/controllers/application_controller_spec.rb中编写测试:

require 'spec_helper'

describe ApplicationController do

  describe "#your_helper_method" do
    it "returns a helpful string" do
      expect(subject.your_helper_method).to eq("a_helpful_string")
    end
  end

end
虽然在这里可以互换使用@controllersubject,但是我会选择subject,因为这是目前RSpec的惯用方式。

1
дҪҝз”ЁжӮЁзҡ„зӯ”жЎҲжөӢиҜ•current_userеҠ©жүӢпјҢе®ғжӯЈеёёиҝҗиЎҢгҖӮ - Nícolas Iensen
这种模式将允许传递规范,即使对于尚未添加到helper_method参数的方法也是如此。我更喜欢将辅助方法定义为“protected”,然后使用expect(subject.send(:your_helper_method)).to eq "a_helpful_string"进行规范化。 - Epigene
send 是一种 hack。不要这样做。 - Ryan Buckley
1
如果这是规范的做法,那么黑客可以达到目的,请参考替代方案。此外,发送是语言规范的一部分,有其存在的原因。 - Konrad Reiche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接