23

我一直在为控制器和模型编写规范,但我从未编写过辅助规范。我不知道我从哪里开始。

我有以下片段application_helper.rb

  def title(page_title)
    content_for(:title) { page_title }
  end
  • 我应该如何在代码上编写帮助规范?
  • 此外,如果有任何开源 Rails 应用程序可以显示良好的帮助测试/规范,请告诉我。
4

5 回答 5

21

来自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
于 2012-10-11T18:57:57.510 回答
11

指定助手时可以使用此语法

假设这是你的助手

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
于 2011-11-24T13:54:12.607 回答
10

也可以将您的助手包含在测试类中,如下所示:

 describe ApplicationHelper do
   helper ApplicationHelper

   it "should work" do
     my_helper_method("xyz").should == "result for xyz"
   end
 end

使用 Rails 3 为我工作。

于 2011-02-07T08:28:47.543 回答
7

当你“描述”它们时,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 的解决方案更好。

于 2010-01-03T23:49:31.990 回答
1

用正则表达式解析 html 真的是在重新发明轮子。这对我来说工作量太大了:太不灵活,太容易出错。(请参阅这个关于推理的讽刺但有趣且准确的 SO 答案)

如果您需要解析助手的 html 输出,您可以尝试 gem rspec-html-matchers。与 webrat 不同,它似乎与 RSpec 3 配合得很好。

那么你也能:

expect(helper.title).to have_tag('title', text: 'What you expect')
于 2015-07-17T15:05:47.480 回答