#ruby-on-rails #ruby #rspec #factory-bot
#ruby-on-rails #ruby #rspec #завод-бот
Вопрос:
Сегодня я столкнулся с действительно странной проблемой с моими спецификациями. Когда я запускаю команду спецификации без указания какого-либо конкретного каталога / файла, мои тесты работают отлично, все зеленые. Однако, если я укажу каталог или файл, rspec выдает несколько (случайных) ошибок в зависимости от того, использую ли я rspec с spring или нет. Более того, вчера, незадолго до окончания моей работы, все работало хорошо. С тех пор я ничего не трогал, и теперь по какой-то причине он сломан. Вот как это происходит:
-
rspec spec/requests/api/v1/users_spec.rb
приводит к
uninitialized constant FactoryGirl
-
spring stop; spring rspec spec/requests/api/v1/users_spec.rb
приводит к
undefined local variable or method 'some_url_helper_here'
Во время выполнения spring rspec
или rspec
работает хорошо без каких-либо исключений. Мой файл спецификации выглядит более или менее так:
# spec/requests/api/v1/users_spec.rb
require 'spec_helper'
describe 'Users API v1', :type => :request do
before do
@user = FactoryGirl.create(:user) # that line throws an exception about unitialized constant FactoryGirl
end
# ...
end
Вы хоть представляете, что, черт возьми, здесь происходит? Заранее спасибо за любые подсказки.
Ответ №1:
У вас проблема с зависимостями, которые не выполняются должным образом в вашем проекте require
.
В целом, все загружается при запуске или тестировании всего приложения. Но некоторые отдельные файлы проекта, загруженные отдельными спецификациями, не обрабатывают правильные require
s или обрабатывают их в неправильном порядке (слишком поздно ссылаться на символ).
Вам нужно будет поработать с вашими файлами, запускать спецификации по отдельности, найти отсутствующий символ и убедиться, что соответствующая библиотека является require
общей, прежде чем она будет использована. После того, как вы таким образом определили правильные зависимости, вы можете захотеть разделить общие зависимости на один помощник. Возможно, вы захотите упорядочить их так, чтобы они соответствовали согласованному стилю / соглашению, например. сингулярные зависимости получают require
общий доступ только в том файле, который в них нуждается, в противном случае у вас есть два помощника — один для загрузки зависимостей тестирования / разработки, сам require
общий во всех отдельных тестовых помощниках и сценариях и один для загрузки зависимостей во время выполнения приложения.
Кроме того, проверьте свой проект на «умную» автозагрузку всего, что находится в папке, например
Dir["lib/*.rb"].each{ |file| require file }
Это может рандомизировать порядок загрузки из-за вашей файловой системы. Если между этими файлами действительно существуют зависимости, так что ‘x.rb’ должен загружаться перед ‘y.rb’, тогда вы получите систематический успех / сбой в зависимости от того, что произошло с вашим компьютером при последнем изменении содержимого этой папки.
Комментарии:
1. Спасибо за ваше объяснение. Но как насчет того факта, что он работал вчера? И это случалось со мной несколько раз раньше. Это всегда одно и то же — я работаю над своим проектом, ненадолго останавливаюсь, а когда я возвращаюсь, все снова так. Затем, через некоторое время, все возвращается в нормальное русло. Это безумие
2. @mbajur: Есть ли у вас какой-либо код, который автоматически загружает необходимые файлы, например, используя список каталогов
Dir["lib/*.rb"].each{|file| require file }
? Это может рандомизировать порядок загрузки из-за вашей файловой системы, что означает, что вы будете получать систематические успехи / неудачи в зависимости от того, что произошло при последнем изменении содержимого этой папки.3. Ну, у меня нет ничего подобного, написанного мной, только те, которые по умолчанию созданы генераторами raiils / rspec.