Так что в моих эволюционирующих rspecs для моей RoR модели, я закончил с двумя испытаниями точно так же:Держите DRY, но хочу повторить по разным причинам
it 'is valid when x is zero' do
foo = build(:foo, x: 0, y: 10)
expect(foo.valid?).to be_truthy
end
it 'is valid when y is ten' do
foo = build(:foo, x: 0, y: 10)
expect(foo.valid?).to be_truthy
end
Это произошло потому, что я написал спецификации для проверки x сначала, затем добавьте спецификацию для y после.
Очевидно, что время для рефакторинга. Я мог бы удалить одну из спецификаций, потому что они дубликаты: держите ее СУХОЙ.
Теперь внутренности каждой спецификации могут быть одинаковыми, но описания it
различны. Я не хочу потерять содержащуюся там информацию.
Мои вопросы - приемлемо ли в этом случае сохранить неповторимые характеристики дубликатов, или я должен «объединить» их и переписать описание it
? Возможно:
it 'is valid when x is zero and y is ten' do
foo = build(:foo, x: 0, y: 10)
expect(foo.valid?).to be_truthy
end
Но на мой взгляд, у меня теперь есть одна спецификация, которая тестирует две вещи (два Validate положений в модели Foo). Это тоже нехорошо. Там запах скрывается.
Есть ли другой подход, который я пропустил?
вполне приемлемо, чтобы иметь оба теста ИМХО –
Это зависит от многого. Должен ли первый тест пройти с 'y: nil'? с 'y: false'? с 'y: MyY.new'? Если нет, у вас уже проблемы. Нужно хотеть, что тестируется. Я бы пошел с 4 тестами для '{x, y} ∈ [good, bad]'. – mudasobwa
Зачем проверять, что 'valid?' Является правдивым, когда вы можете использовать ['# be_valid'] (http://www.rubydoc.info/gems/rspec-rails/RSpec%2FRails%2FMatchers%3Abe_valid), например. 'ожидать (foo). to be_valid' идея абсолютно такая же и делает ее более читаемой, на мой взгляд. – engineersmnky