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?
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
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