5

RSpec でいくつかのコントローラー テストを作成していると、考えられるすべてのユーザー ロールに対していくつかのテスト ケースを繰り返していることに気付きます。

例えば

describe "GET 'index'" do
  context "for admin user" do
    login_user("admin")

    it "has the right title" do
      response.should have_selector("title", :content => "the title")
    end
  end

  context "for regular user" do
    login_user("user")

    it "has the right title" do
      response.should have_selector("title", :content => "the title")
    end
  end
end

これは簡単な例ですが、繰り返されるテストはたくさんあります...もちろん、コンテキストごとに固有のテストもいくつかありますが、ここでは問題ではありません。

テストを 1 回だけ記述して、別のコンテキストで実行する方法はありますか?

4

3 に答える 3

16

共有例は、これに対するより柔軟なアプローチです。

shared_examples_for "titled" do
  it "has the right title" do
    response.should have_selector("title", :content => "the title")
  end
end

そして例では

describe "GET 'index'" do
  context "for admin user" do
    login_user("admin")
    it_behaves_like "titled"
  end
end

共有例を他のスペックファイルに含めて、重複を減らすこともできます。これは、認証/承認をチェックする際のコントローラーテストでうまく機能します。これにより、テストが繰り返されることがよくあります。

于 2011-01-14T00:52:16.967 に答える
3
describe "GET 'index'" do
  User::ROLES.each do |role|
    context "for #{role} user" do
      login_user(role)

      it "has the right title" do
        response.should have_selector("title", :content => "the title")
      end
    end
  end
end

仕様で ruby​​ のイテレータを使用できます。特定の実装を考えると、コードを調整する必要がありますが、これにより、仕様を DRY するための正しいアイデアが得られます。

また、仕様が適切に読み取られるように、必要な調整を行う必要があります。

于 2011-01-13T15:48:43.350 に答える
1

共有サンプル グループを使用してみる

http://relishapp.com/rspec/rspec-core/v/2-4/dir/example-groups/shared-example-group

于 2011-01-13T16:37:05.120 に答える