2016-08-17 8 views
3

私は機能仕様(かなり低レベルが、それでも必要)で、次の期待があります:私はちょうどそれがありますことを確認したいが、私は」することができますので、2番目のクエリの値がファジーマッチでカスタムマッチャーで組み込みRSpecマッチャーを使用できますか?

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

注意をそれについてもっと具体的にしてください。

これをカスタムマッチャーに抽出したいと思います。私が使用を開始:

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マッチャーを使用する必要があります。

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

だから、私の質問は次のとおりです:はRSpecの中でサポートされるカスタムマッチャ内ビルトインマッチャーを使用している

しかし、RSpec::Matchers::BuiltIn内で何がプライベートAPIとしてマークされ

、およびIncludeは、具体的documentedようです?どうすればいいですか?

答えて

4

RSpec::Matchersは、サポートされているAPI(そのRDOCがそう言っていない)ように見えるので、あなたはRubyで代わりのマッチャーDSLであなたのマッチャーを書くことができます(サポートされています。the second paragraph of the custom matcher documentationを参照)、このような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 
+0

メイクセンス。私はそれを試してみましょう。 – awendt

+0

最初に、私はRSpecがURLが 'has_query_params? 'を実装しているというマッチャー名から推測しているが、インクルードを忘れていただけで問題が発生していた。私にpingを送ってくれてありがとう、私はその間に私のenvにいくつかの問題があった。 – awendt

関連する問題