Я очень новичок в Rspec и пытался протестировать сценарий Ruby (это рецепт от шеф-повара) со следующим скелетом.
def foo1
# do stuff
list_of_names # returns a list
end
def foo2(list_of_names)
# do stuff
counter = [...]
.
.
counter_by_name_hash # returns a hash
end
def main
list = foo1
counter_by_name_hash = foo2(list)
end
main
Я хочу утверждать, что функция foo2 возвращает пустой хеш, когда в качестве аргумента передается пустой список, и непустой хэш, когда ей передается допустимый непустой список.
Я пробовал следующие два способа:
Во-первых: здесь я получаю ошибку NoMethodError - undefined method foo2. Не знаю, как объявить subject
, так как метод foo2 находится не в классе, а в скрипте Ruby, который запускается как рецепт Chef.
it 'has valid list of names as input and returns valid hash' do
valid_hash = {...}
expect(subject.foo2(valid_list_of_names)).to eq(valid_hash)
end
Во-вторых: не уверен, что это утверждает возвращаемое значение, поскольку оно не выдает ошибку, даже когда я указываю неожиданное значение в части and_return.
it 'has valid list of names as input and returns valid hash' do
valid_hash = {...}
expect(subject).to receive(:foo2).with(valid_list_of_names).and_return(valid_hash)
subject.foo2(valid_list_of_names)
end
На самом деле мой вопрос заключается в том, как правильно утверждать возвращаемое значение функции foo2 и как мне объявить Subject в моем файле спецификаций, если метод foo2 находится не в классе Ruby, а в рецепте? Любой вклад или помощь приветствуется.