2015-03-29 3 views
1

Я пытаюсь написать тест для простого хэша, однако сам хэш довольно большой.RSpec: тестирование больших хешей в RSpec

Для меньше есть я мог бы написать тест, как так:

describe Hash do 
    it 'should display some kind if hash' do 
    some_hash = { one: 1, two: 2, three: 3 } 
    expect(subject.hash).to eq some_hash 
    end 
end 

Однако для большого есть, где это может показаться громоздким сделать выше (т.е. для имеет двадцать пара ключ-значение) Каков наилучший способ написать тест?

спасибо за вашу помощь

+0

Не достал вас .. Можете ли вы сказать, что вы подразумеваете под * Однако для больших есть, где может показаться громоздким сделать вышеизложенное *? –

ответ

0

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

expect(subject.hash).to include(:one) 

Возможно, вы создадите этот хэш из нескольких методов внутри класса, который он использует. Было бы лучше проверить методы, которые используются для создания хэша.

0

Если вы ждете, что хэш содержит ключи х, но вы не обеспокоены значения на данном этапе, то вы могли бы сделать:

keys_array = [:a, :b, :c, ... :n]` 
expect(subject.hash.keys).to eq keys_array 

Однако, если ваш класс что-то вроде:

class Foo 
    ... 

    def to_h 
    # call other methods and combine into a hash 
    end 
    ... 

end 

и существует нетривиальное количество логики в каждом из этих методов, тогда вам может быть лучше проверить каждый из методов в отдельности.

В качестве альтернативы, вы можете только заботиться, что каждый из ключей возвращает некоторое значение (а не nil):

expect(subject.hash.values).to_not include(nil)

0

Если тест только заботится о некоторых значений в результате хэш, вы не необходимо явно указать любые другие элементы в хэш, которые не имеют отношение к испытанию с использованием include:

describe Hash do 
    it 'should display some kind if hash' do 
    some_hash = { one: 1, two: 2, three: 3 } 
    expect(subject.hash).to include some_hash 
    end 
end 

Вы можете решить создать несколько тестов, каждый тестирование другой часть полученного хэша.

Если тест необходим для проверки все элементы точно, как и ожидалось, вы должны явно создать этот хэш. Вы можете записать его во внешнем местоположении (например, в файле конфигурации или в качестве константы), особенно если он используется повторно в нескольких тестах.

0

В зависимости от типа вашего хэша, вы можете рассмотреть возможность использования приборов: http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html

Или вы можете просто хранить .yml файл в скажем каталог «поддержка» под спецификацией и загрузить хэш в переменный, как это :

my_hash = YAML.load_file('path_to_yml.yml') 
Смежные вопросы