2014-10-28 1 views
0

Я хотел бы использовать аргументы-аргументы, предоставленные rspec, чтобы соответствовать массиву хэшей. Это идеальный код, который мне бы хотелось:RSpec аргумент array array of hashes

context 'logging stock levels' do 
    subject { double(:stock_logger, stock_updated: nil) } 
    let(:stock_importer) { described_class.new(logger: subject) } 
    before(:each) { stock_importer.import } 

    it { is_expected.to have_received(:stock_updated) 
          .with(array_including(hash_including('sku', 'count_on_hand'))) } 
    end 

Это ошибка с несоответствием аргументов для меня. Единственным рабочим решением, которое я могу придумать, является следующее:

context 'logging stock levels' do 
    subject { double(:stock_logger, stock_updated: nil) } 
    let(:stock_importer) { described_class.new(logger: subject) } 
    before(:each) { stock_importer.import } 

    it do 
     is_expected.to have_received(:stock_updated) do |stock_levels| 
     expect(stock_levels).to include(include('sku', 'count_on_hand')) 
     end 
    end 
    end 

Было ли я просто что-то не так?

ответ

0

Попробуйте array_including, но с хэш-ключами. Непроверенная, но, возможно, что-то вроде:

it do 
    is_expected.to have_received(:stock_updated) 
    .with(include(include("sku"), include("bar"))) 
end 
+0

Я попытался 'array_including ('ы' => a_kind_of (String), 'count_on_hand' => a_kind_of (String))) ', но это не соответствовало. Это не имело бы смысла, если бы это сработало. – DrPheltRight

+0

'ожидать ([{: foo =>" blah ",: bar =>" blah2 "}]). Включить (: foo => be_a_kind_of (String),: bar => be_a_kind_of (String))' просто работал консоль для меня – SuckerForMayhem

+0

Да, именно так я ее и решил. Однако я хотел бы решить его с помощью синтаксиса аргумента arg от rspec-mocks. – DrPheltRight

0

С Rspec 3.3 Это работает для меня:

expect(<Object>).to receive(:method).with(
    array_including(hash_including({"id" => some_id})) 
) 

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

  • Нет связанных вопросов^_^