6

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

  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)
...

しかし、上で定義したマッチャーでは、コンマで区切られたシンボルではなく、シンボルの配列を渡す必要があります。そうしないと、テストは最初のシンボルのみを調べます。

何か案は?

4

1 に答える 1

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ループを反転させました。matchメソッドに指定されたブロックはRspec抽象マッチャーによって実行されるブロックであるため、これはRspecが期待する方法だと思います(推測)。

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

したがって、呼び出しshould be_accessible(:name, :surname, :description)は機能します。

ちなみに、属性の存在を確認したいだけなら、単純な

should respond_to(:name, :surname, :description)

同様に動作します。しかし、大量割り当ての面ではそうではありません。

于 2013-04-22T10:14:02.077 に答える