Rspec-core: 異なるフィルターを使用して同じ仕様を複数回実行する

作成日 2011年10月08日  ·  3コメント  ·  ソース: rspec/rspec-core

_免責事項:このリクエストは、特にCapybaraでJavaScript受け入れテストを行うことから生じています。 他の状況のユースケースを見ることができますが。_

私のアプリケーションはすべて、JSをオフにしても正常に動作するようにコーディングされていますが、JSをオンにすると、ユーザーエクスペリエンスをより快適にするための素晴らしいベルやホイッスルがたくさん表示されます。 このため、ユーザーの観点からは、ほとんどのものの相互作用は同じです。 ただし、JSなしとなしの両方で機能することをテストしたいと思います。

私がしたいのは、ある種のフラグを設定して、各フィルターセットで同じ仕様を2回実行するようにRSpecに指示することです。 何かのようなもの:

it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
    # stuff here
end

私はこれが共有の例で達成できることを知っていますが、結果のコードはあまりエレガントではありません。

さらに、Firefox(Selenium)でJSを使用せずにJS(Rack test)を使用せずに、Webkit(capybara-webkit)でJSを使用せずに次のようにテストする場合に使用できます。

it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
    # stuff here
end

また、カスタムフィルターを使用してrun_withオプションを指定する方法も想定しているため、次のようにそれほど冗長ではありません。

it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
    # stuff here
end

考え? ドキュメントとコードを調べましたが、現在、フィルターを使用してこれを行う方法がわかりませんでした。

最も参考になるコメント

フィルタは、箱から出してこれを行うように実際に設計されているわけではありませんが、RSpecに変更を加えなくても、要求されている動作を取得することは難しくありません。

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

これが必要な一般的なパターンである場合は、そのための小さなDSLメソッドを作成できます。

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

次に、次のようにこのメソッドを使用できます。

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

これはかなりエレガントだと思います。 フィルタがどのように機能してあなたが求めていることを実行するかを変更することは、かなり重要な変更であり、めったに使用されないと予想される機能のRSpecチームに将来のメンテナンスの負担を追加するため、私の本能はこれをコアに追加しないことです。

そうは言っても、この機能を提供するrspec-multi-filters gemを作成したい場合は、お気軽に:)。

全てのコメント3件

フィルタは、箱から出してこれを行うように実際に設計されているわけではありませんが、RSpecに変更を加えなくても、要求されている動作を取得することは難しくありません。

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

これが必要な一般的なパターンである場合は、そのための小さなDSLメソッドを作成できます。

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

次に、次のようにこのメソッドを使用できます。

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

これはかなりエレガントだと思います。 フィルタがどのように機能してあなたが求めていることを実行するかを変更することは、かなり重要な変更であり、めったに使用されないと予想される機能のRSpecチームに将来のメンテナンスの負担を追加するため、私の本能はこれをコアに追加しないことです。

そうは言っても、この機能を提供するrspec-multi-filters gemを作成したい場合は、お気軽に:)。

@myronmarstonいつものように、それはRSpecが何ができるかについての私の無知でした。 時間を割いて明確にしていただきありがとうございます。 これはうまくいくと思います。 :)

:+1:すごい

このページは役に立ちましたか?
0 / 5 - 0 評価