rspec и shoulda - дополняющие или альтернативные?

Некоторое время я использовал shoulda, читал и играл с rspec. Я не проводил глубокого сравнения и противопоставления. Но мне кажется, что между ними есть некоторое совпадение, но это не замена 1-1.

Я подумываю о написании некоторых модульных тестов в моей системе rails с помощью rspec без замены всех существующих тестов, написанных с помощью shoulda. Просто как способ почувствовать.

Это хорошая идея? Могу ли я постепенно переходить от одного к другому или я напрашиваюсь на проблемы?

Какие явные преимущества одного перед другим, что я должен учитывать?

Спасибо!


person pitosalas    schedule 05.01.2011    source источник


Ответы (2)


Я должен возразить против ответа Криса, что это альтернативы. Я использую Shoulda и Rspec вместе в своем приложении Rails, и они хорошо дополняют друг друга.

Эта комбинация позволяет мне писать краткие однострочные модульные тесты для повторяющихся вещей, таких как ассоциации и проверки, а также иметь полный набор rspec для более сложных спецификаций. Вы получаете лучшее из обоих миров без каких-либо конфликтов.

Ознакомьтесь с Shoulda README, в котором показано, как установить вместе с Rspec. В нем даже говорится, что он предоставляет «однострочники, совместимые с Test :: Unit и RSpec, которые проверяют общую функциональность Rails. В противном случае эти тесты были бы намного длиннее, сложнее и подвержены ошибкам».

Изменить (примеры):

В верхней части своих спецификаций я всегда объявляю свои тесты отношения классов и проверки, которые кратки и легко читаются.

describe Component do

  context 'relationships' do
    it { should belong_to(:technology)}
    it { should have_many(:system_components) }
    it { should have_and_belong_to_many(:variables) }
    it { should have_many(:images).dependent(:destroy) }
    it { should have_many(:documents).dependent(:destroy) }
  end

  context 'validations' do
    it { should validate_presence_of(:make) }
    it { should validate_presence_of(:model) }
    it { should ensure_length_of(:name).is_at_most(100) }
    it { should validate_presence_of(:technology_id) }
  end
end

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

person Peter Brown    schedule 06.01.2011
comment
Вот еще несколько точек зрения на это: stackoverflow.com/questions/3604564/rspec-vs-shoulda - person Peter Brown; 06.01.2011
comment
Мне бы хотелось увидеть несколько примеров того, что вы делаете с комбо, чего нельзя было бы сделать ни с одним, ни с другим. Если есть способы, которыми я могу очистить свои тесты, я полностью за это. Я использовал вместе shoulda + matchy, затем обнаружил, что в основном это делает rspec, и пошел дальше. Это просто такие вещи, как сопоставители контроллеров? - person Chris Heald; 06.01.2011
comment
Я обновил свой ответ, добавив некоторые тесты, которые у меня есть. Одно правило, которому я стараюсь следовать, заключается в том, что Shoulda используется для встроенных в Rails макросов классов, таких как проверки и отношения, а Rspec предназначен для более сложных тестов, где требуются имитирующие объекты и заглушки методов. - person Peter Brown; 06.01.2011
comment
+1 Они бесплатны, по крайней мере, при использовании с Rails. Позволяет делать такие вещи, как it { should validate_presence_of(...) }. - person Robert Speicher; 07.01.2011
comment
+1 @Beerlington, могу я спросить, есть ли в ваших тестовых файлах модели какие-то context 'database schema', где вы бы использовали методы shoulda, такие как have_db_column и have_db_index? Или это считается слишком избыточным, ненужным и / или низкоуровневым, чтобы помещать его в тестовый файл модели? - person Paul Fioravanti; 19.08.2012
comment
@PaulFioravanti Я не тестирую на это. Я тестирую только то, что связано с поведением, и не рассматриваю наличие столбца или поведение индекса. Столбцы базы данных не исчезают просто так, если их кто-то намеренно не удаляет, но вы можете защитить от этого с помощью проверки кода и доверия :) - person Peter Brown; 19.08.2012

rspec и shoulda - альтернативы друг другу. Я тоже начал с shoulda, а перейти на rspec так же просто, как s/context/describe/, s/should/it/, и вы готовы к гонкам. В rspec есть множество уловок, различных интеграций и более сложных сопоставлений, поэтому я сам сейчас использую его чаще.

Одно из моих первоначальных разочарований заключалось в том, что было почти невозможно найти учебник, в котором не использовались бы Rails и Cucumber. Не зацикливайтесь на этом - вы можете многое с ним сделать, но вам не обязательно иметь огромное количество раствора, прежде чем вы сможете его использовать.

person Chris Heald    schedule 05.01.2011