10

機能仕様で次のことを期待しています (かなり低レベルですが、それでも必要です)。

expect(Addressable::URI.parse(current_url).query_values).to include(
  'some => 'value',
  'some_other' => String
)

2 番目のクエリ値はあいまい一致であることに注意してください。これは、それが存在することを確認したいだけですが、これ以上具体的に説明することはできません。

これをカスタムマッチャーに抽出したいと思います。私はから始めました:

RSpec::Matchers.define :have_query_params do |expected_params|
  match do |url|
    Addressable::URI.parse(url).query_values == expected_params
  end
end

しかし、これは私がそこを通り抜けることができないことを意味{'some_other' => String}します。あいまい一致を使い続けるにincludeは、カスタム マッチャーでマッチャーを使用する必要があります。

ただし、その中のものRSpec::Matchers::BuiltInはすべてプライベート API としてマークされており、Include具体的には次のように文書化されています。

# Provides the implementation for `include`.
# Not intended to be instantiated directly.

だから、私の質問は: RSpec でサポートされているカスタムマッチャー内で組み込みマッチャーを使用していますか? どうすればいいですか?

4

3 に答える 3

8

RSpec::Matchersはサポートされている API のようです (その rdoc はそうではありません)。そのため、マッチャー DSL の代わりに Ruby でマッチャーを記述し (これはサポートされています。カスタム マッチャー ドキュメントの 2 番目の段落を参照してRSpec::Matchers#includeください)、次のように使用できます。

仕様/サポート/matchers.rb

module My
  module Matchers
    def have_query_params(expected)
      HasQueryParams.new expected
    end

    class HasQueryParams
      include RSpec::Matchers

      def initialize(expected)
        @expected = expected
      end

      def matches?(url)
        actual = Addressable::URI.parse(url).query_values
        @matcher = include @expected
        @matcher.matches? actual
      end

      def failure_message
        @matcher.failure_message
      end

    end
  end
end

仕様/サポート/matcher_spec.rb

include My::Matchers

describe My::Matchers::HasQueryParams do
  it "matches" do
    expect("http://example.com?a=1&b=2").to have_query_params('a' => '1', 'b' => '2')
  end
end
于 2016-08-17T12:43:00.810 に答える