Соглашения об именах RSpec для файлов и структуры каталогов
Я пишу тесты RSpec, и я пришел к выводу, что не читаю те же мнения на разных сайтах. Структура каталогов для RSpec ясна, когда мы имеем дело со спецификациями/контроллерами и каталогами спецификаций/моделей, но противоречивая информация, которую я получаю, касается тестирования просмотров.
Я хотел бы просто поставить эти тесты в каталог spec/integration/, но я прочитал, что он должен быть в spec/integration, но в другой книге говорится о спецификациях/запросах. Это имеет значение?
Чтобы еще больше усложнить ситуацию, я прочитал противоречивую информацию о наименовании фактических имен файлов тестов! Например, если у меня был каталог controller/model/view с именем "people" (я использую haml), я должен назвать такие файлы следующим образом:
Спецификация/интеграция/people.html.haml_spec.rb
Однако другая книга предлагает следующее:
спецификации/запросы/people_spec.rb
Я хотел бы немного пояснить соглашения об именах в RSpec и ПОЧЕМУ я должен назвать те тесты конкретных имен, а также вопрос о том, нужно ли их помещать в спецификацию/интеграцию или спецификации/запросы. Мне кажется, что я иду с ветром здесь.
Любая помощь очень ценится.
Ответы
Ответ 1
Проверьте даты книг и версии RSpec, для которых они были написаны. Структура именования со временем изменилась незначительно.
В соответствии с документами для rspec-rails спецификации запроса могут идти в spec/request, spec/api или spec/integration. Я предпочитаю вводить спецификации запроса в spec/request.
Чтобы сделать вещи более интересными, если вы используете Capybara с rspec-rails, он будет работать со спецификациями/запросами для Capybara 1.x и spec/features для Capybara 2.
Что касается отдельных имен файлов спецификаций, когда есть определенный тест класса, например, модель Rails, вы должны использовать аналогичное имя файла спецификации:
app/models/user.rb
→ spec/models/user_spec.rb
Просмотр спецификаций должен использовать имя шаблона:
app/views/users/index.html.erb
→ spec/views/users/index.html.erb_spec.rb
Модели с именами должны включать пространство имен в пути к файлам спецификаций:
app/models/admin/user.rb
→ spec/models/admin/user_spec.rb
Генератор эхолота RSpec является хорошим ориентиром для показа, где эти спецификации принадлежат.
Если нет определенного теста класса, как в случае с спецификациями запросов, IMHO вы должны иметь право использовать имя, которое описывает тестируемую вещь. Например. spec/requests/place_an_order_spec.rb
.
Ответ 2
Файлы, считываемые rspec gem, это просто те, которые заканчиваются на _spec.rb
и которые находятся где угодно в иерархии ниже папки spec
, пока вершина иерархии является буквенно-цифровым словом (то есть, файлы под папкой с именем spec/##/
не будут учитываться при генерации спецификаций.) Это соответствующая строка кода, которая реализует это, в /gems/rspec-rails-2.14.1/lib/rspec/rails/tasks/rspec.rake
:
namespace :spec do
types = begin
dirs = Dir['./spec/**/*_spec.rb'].
map { |f| g=f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') ; puts ">>> Found #{g}."; g }.
uniq.
select { |f| File.directory?(f) }
Hash[dirs.map { |d| [d.split('/').last, d] }]
end
Итак, весь текст в имени файла, предшествующий _spec.rb
, является соглашением - он не изменяет способ обработки Rails файлов.
Мне нужно будет прочитать код намного больше, чтобы понять, какое значение имеет имя каждой папки под spec
, - оно передается в создаваемую задачу Rake spec, поэтому она используется для что-то, но я не знаю, что.