2015-10-20 4 views
0

Я хочу проверить с RSpec функцию my_test. Функция вызывает метод класса другого класса MyHelper.func в rails 4. Я использовал mock для иллюстрации func в классе MyHelper, и я хочу совместить аргумент, который func получает с некоторыми значениями const.RSpec: ожидать массив хешей в классе_double получить

Я использовал

expect(<double>).to receive(func).with(arguments) 

Но один из константных аргументов является хэш с более чем 2-х элементов. Когда я проверить мою функции, RSpec выдает ошибку:

received :func with unexpected arguments. 
expected: [{"1"=>33.33},{"2"=>33.33},{"3"=>33.33}] 
got: [{"2"=>33.33},{"1"=>33.33},{"3"=>33.33}] 

Есть ли способ, чтобы соответствовать между двумя массивами? Код:

my_hash = [{"1"=>33.33},{"2"=>33.33},{"3"=>33.33}] 
notifier = class_double("MyHelper"). 
       as_stubbed_const(:transfer_nested_constant => true) 
expect(notifier).to receive(:func).with(my_hash) 

ответ

0

Это немного сложнее, так как вы сравниваете две вещи, которые не равны при использовании ==

let(:expected) { [{"1"=>33.33},{"2"=>33.33},{"3"=>33.33}] } 
let(:actual) { [{"2"=>33.33},{"1"=>33.33},{"3"=>33.33}] } 

expect(actual).to eq(expected) # fails 

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

RSpec::Matchers.define :sorted_array_match do |expected| 
    match do |actual| 
    expected_hash = expected.inject({}) {|m,(k,v)| m.merge!(k=>v)} 
    actual_hash = actual.inject({}) {|m,(k,v)| m.merge!(k=>v)} 
    actual_hash == expected_hash 
    end 
end 

it "should work" do 
    expect(notifier).to receive(:func).with(sorted_array_match(expected)) 
    notifier.func(actual) 
end 

Заметим, что это преобразует аргумент массив в хэш, так что она принимает аргументы массивы, содержащие хешей с разными ключами. Возможно, вам придется изменить его, чтобы он соответствовал фактическим данным.

Дополнительная информация в RSpec docs.

+0

Спасибо! Это отличный пример того, как использовать наши собственные матчи :) – McMendel

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