2011-01-18 27 views
15

Lưu ý cho người đọc trong tương lai: nghĩ rằng RSpec không coi Hashes của bạn bằng nhau? Một có thể là một OrderedHash, nhưng từ đầu ra RSpec thông thường bạn không thể biết được. Đây là vấn đề mà nhắc bài đăng này.Trình kết hợp RSpec2 có phù hợp với Hashes tồn tại không?

Câu hỏi gốc:

Giả sử tôi có thông số kỹ thuật nơi tôi muốn kiểm tra phương thức tạo Hash thích hợp.

it 'should generate the Hash correctly' do 
    expected = {:foo => 1, 'baz' => 2} 
    subject.some_method_that_should_generate_the_hash.should == expected 
end 

Điều này thường không thành công do các cặp khóa-giá trị khác nhau có thể trả lại cặp theo thứ tự khác nhau. Kết quả trông giống như:

Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected 
expected: {:foo => 1, 'baz' => 2}, 
    got: {'baz' => 2, :foo => 1} 

Đối với mảng, điều này được giải quyết bằng toán tử = ~. Tuy nhiên, điều đó không làm việc cho Hashes. Hiện tại, tôi đã sử dụng số điện thoại

it 'should generate the Hash correctly' do 
    expected = {:foo => 1, 'baz' => 2} 
    subject.some_method_that_should_generate_the_hash.each {|k,v| 
    v.should == expected[k] 
    } 
end 

nhưng điều đó dường như không cần thiết. Tôi hy vọng có một giải pháp rõ ràng cho việc này. Tôi có nhìn thấy một cái gì đó trong các tài liệu hoặc không RSpec có một Matcher thích hợp cho trật tự Hash bình đẳng?

Trả lời

17
describe 'Hash' do 
    let(:x) { { :a => 1, :b => 2 } } 
    let(:y) { { :b => 2, :a => 1 } } 

    it "should be equal with ==" do 
    x.should == y 
    end 
end 

Passes. Tôi không chắc những gì đang xảy ra trong trường hợp cụ thể của bạn. Bạn có một số ví dụ không bạn có thể chia sẻ?

Lập trình Ruby có này để nói:

Bình đẳng - Hai băm đều bình đẳng nếu họ có giá trị mặc định đó, họ chứa cùng một số các phím, và giá trị tương ứng với mỗi chủ chốt trong băm đầu tiên bằng nhau (sử dụng ==) đến giá trị cho cùng một khóa trong giây.

+0

Hôm qua muộn tôi thấy vấn đề: Tôi không thực sự so sánh hai Hashes: một người đã biến thành một OrderedHash ở đâu đó trên đường đi. Bạn không thể liếc qua nó từ đầu ra RSpec và tôi hơi xấu hổ khi nói đây không phải lần đầu tiên tôi rơi vào cái bẫy này:/ – Confusion

+3

Thú vị. Vì vậy, một OrderedHash và một Hash với cùng một cặp khóa/giá trị không được coi là bình đẳng - đó là điều tốt để biết. – zetetic

3

Tôi tin rằng eql? Phương pháp kiểm tra duy nhất mà hai băm có cùng một nội dung Vì vậy IIRC trong Rspec2 bạn có thể làm:

expected = {:foo => 1, 'baz' => 2} 
    expected.should be_eql({'baz' => 2, :foo => 1}) 

Và các thử nghiệm cần vượt qua

+0

hoặc trong rspec 3, 'mong đợi (x) .to eql (y) ' – nruth

6

Kể từ tháng 8 viên ngọc rspec-matchers đã hỗ trợ cho phù hợp với băm:

expected.should be_hash_matching(subhash_or_equal) 

xem ở đây để biết thêm chi tiết: https://github.com/rspec/rspec-expectations/pull/79

+0

điều này dường như đã bị xóa trong rspec 3, nhưng '.to eql (x)' hoạt động – nruth

Các vấn đề liên quan