2016-03-07 2 views
7

У меня есть два хеша h1 и h2, которые я хотел бы сравнить в RSpec.Как сравнить два хэша в RSpec?

Я хочу проверить, что элементы h1 такие же, как h2 после некоторых преобразований, которые мы назовем f. То есть, я хочу проверить, что для каждого ключа k в h1, h1[k] == f(h2[k]).

Например, если все значения в h2 в два раза больше соответствующих значений в h1, то я хочу, чтобы проверить, что для каждого ключа k в h1, h2[k] == h1[k] * 2.

Каков правильный способ сделать это в RSpec? В настоящее время я:

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

но это похоже неуклюжий.

+0

Я бы создал вспомогательный метод 'equal? ​​(Other)', который вычисляет - оттуда, 'ожидать (h2.equal? ​​(H1)). Быть истинным' – onebree

+2

Ваш вопрос очень вводит в заблуждение. Вы переключаете роль 'h1' и' h2' в свое объяснение и в свой код. – sawa

+0

Кроме того, ваше описание (а также код) описывает, что соответствие является одним из способов, то есть не имеет значения, имеет ли 'h2' текст объяснения, кроме того, что имеет значение' h1'. Это то, что вы намерены? – sawa

ответ

4

Похоже, что вы тестируете это преобразование. Я бы подумал написать что-то вроде этого:

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 

Для меня в описании четко сказано, что мы ожидаем. Тогда из теста можно легко понять, что такое вход и ожидаемый результат. Кроме того, это использует хэш Искателя, который обеспечит хороший диф двух хэшей на провал:

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

(compared using ==) 

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

Хотя я бы вопрос, что означает, что отношения ключ-значение. Являются ли это просто тестовыми примерами, которые вы пытаетесь выполнить? Если это так, я просто сделаю каждый уникальный тест. Если в этом есть что-то большее, то я могу задать вопрос, почему метод преобразования не предоставляет хеш для начала.

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

Что касается меня, кажется более читаемым.

0

Для точного равенства:

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

Как насчет:

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 

Чуть более многословно, но, возможно, более удобным для чтения?

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