2016-08-17 3 views
3

У меня есть следующие ожидания в полнометражной спецификации (довольно низкий уровень, но по-прежнему необходимо):Могу ли я использовать встроенный помощник 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 в моем пользовательском совпадении.

Однако, все, что в RSpec::Matchers::BuiltIn отмечен как частный API, и Include конкретно является documented как:

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

Итак, мой вопрос: использует встроенный в Искателя в пользовательской согласовани поддерживается в RSpec ? Как мне это сделать?

ответ

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? ', Но это было только потому, что я забыл включить include. Спасибо за то, что я звонил мне, между тем у меня были проблемы с моим env. – awendt

Смежные вопросы