22


3

Ruby on RailsとRSpecでヘルパーの仕様を作成する

私はコントローラーとモデルの仕様を書いてきましたが、ヘルパーの仕様を書いたことはありません。 どこから始めたらいいかわかりません。

`application_helper.rb`に次のスニペットがあります

  def title(page_title)
    content_for(:title) { page_title }
  end
  • コードにヘルパー仕様を書くにはどうすればよいですか?

  • また、優れたヘルパーを表示するオープンソースのRailsアプリがある場合 テスト/仕様を教えてください。

5 Answer


18


https://github.com/rspec/rspec-rails#helper-specs [ヘルパー仕様のrspec-railsドキュメント]から:

_ _ ヘルパー仕様はspec / helpersに存在し、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


10


次のように、テストクラス内にヘルパーを含めることもできます。

 describe ApplicationHelper do
   helper ApplicationHelper

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

Rails 3で作業しました。


9


ヘルパーを指定するときにhttps://www.relishapp.com/rspec/rspec-rails/docs/helper-specs/helper-spec[this syntax]を使用することが可能です

これがあなたのヘルパーだとしましょう

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


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 =~ /foo<\/title>/
  end
end

それ以外の場合、ヘルパーの動作のみをテストする場合(これは重要であるか、ビューがないため)@Kenのソリューションの方が優れています。


1


正規表現を使用したhtmlの解析は、実際に車輪を再発明しています。 それは私にとってあまりにも多くの仕事です:柔軟性がありすぎ、エラーが発生しやすくなります。 (理由については、https://stackoverflow.com/a/1732454/1555599 [皮肉だが陽気で正確なSOの回答]を参照してください)

ヘルパーによってhtml出力を解析する必要がある場合は、gems rspec-html-matchersを試してください。 webratとは異なり、RSpec 3でうまく動作するようです。

それからあなたはできる:

expect(helper.title).to have_tag('title', text: 'What you expect')