2012-03-19 3 views
4

私はマイケル・ハートルで「Railsのチュートリアル」の新バージョンを読んでいると、私はキュウリとBDDにかなり好きなんだから、私は著者はここで指摘かについて自分自身を懸念が見つかりました:いくつかの単語でhttp://ruby.railstutorial.org/chapters/sign-in-sign-out?version=3.2#sec:rspec_custom_matchersキュウリのRSpecカスタムマッチャーをDRY実装依存のテストにすることは可能ですか?

こうしたカスタム照合がなければならないため

RSpec::Matchers.define :have_error_message do |message| 
    match do |page| 
    page.should have_selector('div.alert.alert-error', text: message) 
    end 
end 

:このようなRSpecのカスタムマッチャを書く

Then /^he should see an error message$/ do 
    page.should have_selector('div.alert.alert-error', text: 'Invalid') 
end 

:キュウリの主な面倒は、このような実装依存のテストを乾燥することは不可能だということですspec/support/utilities.rbを入れ、RSpec統合テストから呼び出すことができますが、キュウリのステップ定義から呼び出すことはできません。

あなたはそれについてどう思っていますか?

ありがとうございます。

+0

- あなたは 'have_error_message'マッチャーを共有したいですあなたのキュウリのステップとあなたのRSpecスペックの間に?あるいは、キュウリのテストスイート内で重複を減らそうとしていますか? –

+0

最初の目的は、キュウリのテストスイート内で実装依存のメソッドを集約して、重複を減らすことですが、 "have_error_message"などのRspecマッチャを再利用することも可能であれば、DRYer! – Darme

答えて

3

実装依存型または再利用可能なメソッド、ロケータをCucumber Worldに配置できます。あなたのシナリオの

例:ここでは

# step_definitions/general_steps.rb 
Then /^he should see an error message "(.+)"$/ do |text| 
    within(error_message) do 
    page.should have_content(text) 
    end 
end 

# support/general_helpers.rb 
module GeneralHelpers 
    def error_message 
    page.first('div.alert.alert-error') 
    end 
end 

World(GeneralHelpers) 

は、このアプローチを参照してくださいいくつかの記事は以下のとおりです。

5

あなたは確かにRSpecの照合プログラムを作成することができますし、あなたのキュウリのステップでそれらを使用する - 私はこれを行うかなり頻繁に。私はちょうどfeatures/support/matchersにそれらを配置し、それらは即座に私のステップ定義で使用するために利用可能です。

RSpecテストでも共有したい場合は、別のshared_testタイプの場所にファイルを解凍してから、requireフォルダにCucumber env.rbファイルとRSpec spec_helper .rbファイルを使用すると、両方のテストフレームワークで使用できるようになります。

+2

RSpecのCucumberの 'World'メソッドを定義する解決策がたくさんありますが、これはもっとシンプルでクリーンです。ありがとうございました! – michelpm

+1

この作業をするには、 'features/support/matchers'ファイルの先頭に' require 'rspec/matchers''を追加しなければなりませんでした。 – Franco

0

あなたはキュウリでRSpecのカスタムマッチャを使用する方法のジョン・Mの答えの例:私はあなたが本当に求めているのかわからないんだけど

# spec/support/matchers/http.rb 
RSpec::Matchers.define :return_http_success do 
    match do |actual| 
    actual >= 200 && actual <= 299 
    end 
end 

# features/support/matchers.rb 
Dir[Rails.root.join('spec/support/matchers/*.rb')].each { |file| require file }