我一直在为控制器和模型编写规范,但我从未编写过辅助规范。我不知道我从哪里开始。
我有以下片段application_helper.rb
def title(page_title)
content_for(:title) { page_title }
end
- 我应该如何在代码上编写帮助规范?
- 此外,如果有任何开源 Rails 应用程序可以显示良好的帮助测试/规范,请告诉我。
我一直在为控制器和模型编写规范,但我从未编写过辅助规范。我不知道我从哪里开始。
我有以下片段application_helper.rb
def title(page_title)
content_for(:title) { page_title }
end
来自Helper Specs 上的 rspec-rails 文档:
帮助规范存在于规范/帮助者中,并混合在 ActionView::TestCase::Behavior 中。
提供一个辅助对象,该对象混合在指定的辅助模块中,以及 ApplicationHelper(如果存在)。
require 'spec_helper'
describe ApplicationHelper do
describe "#title" do
it "displays the title" do
# helper is an instance of ActionView::Base configured with the
# ApplicationHelper and all of Rails' built-in helpers
expect(helper.title).to match /Some Title/
end
end
end
指定助手时可以使用此语法
假设这是你的助手
module ApplicationHelper
def page_title
@title || nil
end
end
然后你可以用这个语法指定它
require "spec_helper"
describe ApplicationHelper do
describe "#page_title" do
it "returns the instance variable" do
assign(:title, "My Title")
helper.page_title.should eql("My Title")
end
end
end
也可以将您的助手包含在测试类中,如下所示:
describe ApplicationHelper do
helper ApplicationHelper
it "should work" do
my_helper_method("xyz").should == "result for xyz"
end
end
使用 Rails 3 为我工作。
当你“描述”它们时,RSpec 应该自动从你的 Rails 环境中加载类和模块,所以一个有效的帮助规范可能是:
#deleted
但请记住,bdd 不是测试每一个方法,而是测试应用程序的行为。
编辑:
正如@Ken 所说,我的规范不正确,这绝对是错误的做法。所以我提出了一个我更喜欢的请求规范解决方案,而不是帮助规范。
# inside your helper
def title=(page_title)
content_for(:title) { page_title }
end
# views/resource/index.html.erb
<% title = "foo" %>
# views/layouts/application.html.erb
<%= yield :title %>
# request spec
require 'spec_helper'
describe YourResource do
it "should output content for title"
get "/resource"
response.body.should =~ /<title>foo<\/title>/
end
end
否则,如果您只想测试助手行为(因为它很关键或因为您没有任何意见)@Ken 的解决方案更好。
用正则表达式解析 html 真的是在重新发明轮子。这对我来说工作量太大了:太不灵活,太容易出错。(请参阅这个关于推理的讽刺但有趣且准确的 SO 答案)
如果您需要解析助手的 html 输出,您可以尝试 gem rspec-html-matchers。与 webrat 不同,它似乎与 RSpec 3 配合得很好。
那么你也能:
expect(helper.title).to have_tag('title', text: 'What you expect')