2013-04-21 17 views
5

RSpecを使用してRoRでテスト用のカスタムマッチャーを作成しようとしています。複数の引数を持つRSpecとカスタムマッチャー

define :be_accessible do |attributes| 
    attributes = attributes.is_a?(Array) ? attributes : [attributes] 
    attributes.each do |attribute| 
     match do |response| 
     response.class.accessible_attributes.include?(attribute) 
     end 
     description { "#{attribute} should be accessible" } 
     failure_message_for_should { "#{attribute} should be accessible" } 
     failure_message_for_should_not { "#{attribute} should not be accessible" } 
    end 
    end 

私は私のテストでは、次のようなものを書くことができるようにしたい:

... 
should be_accessible(:name, :surname, :description) 
... 

が、上記で定義されたマッチャと、私はシンボルの代わりで区切られたシンボルの配列を渡す必要がありますカンマでなければ、最初のシンボルだけが検査されます。

アイデア?

+0

あなたの最初の必要性に合わせる必要があります:http://stackoverflow.com/a/4/43289/582863とにかく、私はここであなたの意図を知りたいのですが...あなたのrspecテストファイルの行数を減らしたいのですか、またはモデル属性の複雑なテストをテストしていますか? – Saaman

+0

あなたが提供したリンクの問題は、これが「通常の」defメソッドではないため、*を使うことができないということです。あなたの質問に答える、私はちょうど私のrspecの線を減らしたい:) –

答えて

4

私はそれがこの方法を働かせた:

RSpec::Matchers.define :be_accessible do |*attributes| 
    match do |response| 

    description { "#{attributes.inspect} be accessible" } 

    attributes.each do |attribute| 
     failure_message_for_should { "#{attribute} should be accessible" } 
     failure_message_for_should_not { "#{attribute} should not be accessible" } 

     break false unless response.class.accessible_attributes.include?(attribute) 
    end 
    end 
end 

私はmatcheachループを反転。私はこれがRspec抽象マッチャー(私が推測する)によって実行されたものであるので、matchメソッドに与えられたブロックがあるので、これがRspecがそれを期待する方法だと思う。

ブロックを|*attributes|で定義すると、パラメータのリストを取り、Arrayに変換します。

したがって、should be_accessible(:name, :surname, :description)を呼び出すと機能します。同様に動作

ところで

、あなただけの属性の存在を確認したい場合は、シンプルな

should respond_to(:name, :surname, :description) 
。しかし、それは大量配属のようには見えません。

+0

それはあなたの時間のために、うまく動作します!あなたのソリューションが私が必要とするものであるように、質量割り当てを確認したい。 –

+0

これは本当に助けになりましたが、この例を自分の状況に適応させたとき、私はそれが肯定的な期待のためにしか機能しないことを発見しました(should_notはそのままでは機能しません)。私は別の 'match_for_should'と' match_for_should_not'ブロックをここで詳しく述べるように作成しなければなりません:https://www.relishapp.com/rspec/rspec-expectations/v/3-0/docs/custom-matchers/define-matcher#matcher独立論理を持つべきであり、そうでなければならない – manafire

関連する問題