2014-05-22 11 views
12

Tôi có một mảng băm, mà vì lợi ích của các đối số trông như thế này:RSpec trận mảng băm

[{"foo"=>"1", "bar"=>"1"}, {"foo"=>"2", "bar"=>"2"}] 

Sử dụng RSpec, tôi muốn kiểm tra xem "foo" => "2" tồn tại trong mảng, nhưng tôi don' t quan tâm cho dù đó là mục đầu tiên hoặc thứ hai. Tôi đã thử:

[{"foo" => "1", "bar" => "2"}, {"foo" => "2", "bar" => "2"}].should include("foo" => "2")) 

Nhưng điều này không có tác dụng, vì băm phải khớp chính xác. Có cách nào để kiểm tra từng phần nội dung của băm không?

+0

'[{" foo "=>" 1 "," bar "=>" 2 "}, {" foo "=>" 2 "," bar "=>" 2 "}]. flat_map (&: to_a) .nên bao gồm ([ "foo", "2"]) 'cũng sẽ hoạt động. –

Trả lời

4

Bạn có thể sử dụng phương pháp any?. Xem this để biết tài liệu.

hashes = [{"foo" => "1", "bar" => "2"}, {"foo" => "2", "bar" => "2"}] 
expect(hashes.any? { |hash| hash['foo'] == '2' }).to be_true 
0

Nếu thử nghiệm riêng biệt của băm không phải là một yêu cầu nghiêm ngặt Tôi sẽ làm điều đó theo cách này:

[{"foo" => "1", "bar" => "2"}, {"foo" => "2", "bar" => "2"}].map{ |d| d["foo"] }.should include("2") 
24

thì sao?

hashes = [{"foo" => "1", "bar" => "2"}, {"foo" => "2", "bar" => "2"}] 
expect(hashes).to include(include('foo' => '2')) 
+1

Và nếu bạn muốn tất cả thay vì bất kỳ, tốt, bạn có thể sử dụng 'all': mong đợi (băm) .cho tất cả (bao gồm ('foo' => '2')) –

+0

tài liệu cho' all' tại đây: https: //www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/all-matcher – Kris

+4

Tác phẩm này hoạt động, nhưng tôi sẽ gọi cụm từ là: 'expect (hashes) .to bao gồm (a_hash_including (" foo ") => "2")) ' –

1

bạn có thể sử dụng quẹt composable

http://rspec.info/blog/2014/01/new-in-rspec-3-composable-matchers/

nhưng tôi thích để xác định một khớp tùy chỉnh như thế này

require 'rspec/expectations' 

RSpec::Matchers.define :include_hash_matching do |expected| 
    match do |array_of_hashes| 
    array_of_hashes.any? { |element| element.slice(*expected.keys) == expected } 
    end 
end 

và sử dụng nó trong các thông số kỹ thuật như thế này

describe RSpec::Matchers do 
    describe '#include_hash_matching' do 
    subject(:array_of_hashes) do 
     [ 
     { 
      'foo' => '1', 
      'bar' => '2' 
     }, { 
      'foo' => '2', 
      'bar' => '2' 
     } 
     ] 
    end 

    it { is_expected.to include_hash_matching('foo' => '1') } 

    it { is_expected.to include_hash_matching('foo' => '2') } 

    it { is_expected.to include_hash_matching('bar' => '2') } 

    it { is_expected.not_to include_hash_matching('bar' => '1') } 

    it { is_expected.to include_hash_matching('foo' => '1', 'bar' => '2') } 

    it { is_expected.not_to include_hash_matching('foo' => '1', 'bar' => '1') } 

    it 'ignores the order of the keys' do 
     is_expected.to include_hash_matching('bar' => '2', 'foo' => '1') 
    end 
    end 
end 


Finished in 0.05894 seconds 
7 examples, 0 failures 
Các vấn đề liên quan