2016-03-07 14 views
7

Tôi có hai băm h1h2 mà tôi muốn so sánh trong RSpec.Làm cách nào để so sánh hai băm trong RSpec?

Tôi muốn kiểm tra xem các phần tử của h1 có giống như h2 sau một số phép chuyển đổi mà chúng tôi sẽ gọi là f. Tức là, tôi muốn xác minh rằng đối với mỗi khóa k trong h1, h1[k] == f(h2[k]).

Ví dụ, nếu tất cả các giá trị trong h2 là hai lần lớn như các giá trị tương ứng trong h1, sau đó tôi muốn kiểm tra xem cho mỗi phím k trong h1, h2[k] == h1[k] * 2.

Cách thích hợp để thực hiện điều này trong RSpec là gì? Hiện tại tôi làm:

h1 = ... 
expect(
    h2.all? { |k,v| 
    v == f(h1[k]) 
    } 
).to be true 

nhưng điều đó có vẻ khó khăn.

+0

Tôi sẽ tạo phương thức trợ giúp 'bằng? (Khác)' mà tính toán - từ đó, 'mong đợi (h2.equal? ​​(H1)). Là đúng ' – onebree

+2

Câu hỏi của bạn rất gây hiểu lầm. Bạn đang chuyển vai trò của 'h1' và' h2' trong lời giải thích của bạn và trong mã của bạn. – sawa

+0

Ngoài ra, mô tả của bạn (cũng như mã) mô tả rằng khớp là một cách, tức là, không quan trọng nếu 'h2' trong văn bản giải thích có các phím khác với những gì' h1' có. Đây có phải là những gì bạn dự định không? – sawa

Trả lời

4

Âm thanh giống như những gì bạn đang thử nghiệm là việc chuyển đổi. Tôi sẽ xem xét viết một cái gì đó như thế này:

it "transforming something does something" do 
    base_data = { k1: 1, k2: 2 } 
    transformed_data = base_data.each_with_object({}) { |(k, v), t| 
    t[k] = f(v) 
    } 

    expect(transformed_data).to eq(
    k1: 2, 
    k2: 4, 
) 
end 

Với tôi mô tả nêu rõ những gì chúng tôi đang mong đợi. Sau đó, tôi có thể dễ dàng nhìn thấy từ kiểm tra đầu vào là gì và đầu ra mong đợi. Ngoài ra, điều này thúc đẩy trình kết hợp băm sẽ cung cấp sự khác biệt tốt đẹp của hai băm trên một lỗi:

expected: {:k1=>2, :k2=>4} 
    got: {:k1=>1, :k2=>4} 

(compared using ==) 

Diff: 
@@ -1,3 +1,3 @@ 
-:k1 => 2, 
+:k1 => 1, 
:k2 => 4, 

Mặc dù tôi sẽ đặt câu hỏi về mối quan hệ khóa-giá trị. Đây có phải là những trường hợp thử nghiệm đơn giản mà bạn đang cố chạy qua không? Nếu vậy, tôi chỉ cần làm cho mỗi bài kiểm tra duy nhất. Nếu có một cái gì đó nhiều hơn với nó, sau đó tôi có thể hỏi tại sao phương pháp chuyển đổi không được cung cấp băm để bắt đầu.

1
h1.each do |k, v| 
    expect(v).to eq(f(h2[k])) 
end 

Đối với tôi, có vẻ dễ đọc hơn.

0

Đối với một sự bình đẳng chính xác:

expect(h1).to eq h2.map { |k, v| [k, f(v)] }.to_h 
1

Làm thế nào về:

h2 = f(h1) 

expect(h2.keys).to eq(h1.keys) # I assume you want this, too 

h1.keys.each do |k| 
    expect(h2[k]).to eq(h1[k] * 2) 
end 

Một chút dài dòng hơn, nhưng có lẽ dễ đọc hơn?

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