Как вы решаете FixtureClassNotFound: нет класса, чтобы найти

При выполнении моих тестов я получаю эту ошибку:

FixtureClassNotFound: No class attached to find

Что вызывает эту ошибку и как ее исправить?

Ответ 1

Скорее всего, это происходит из-за того, что для модели используется пользовательское имя таблицы (с использованием имени set_table_name) или модель находится в модуле.

Чтобы решить проблему, вам нужно добавить строку set_fixture_class в test_helper.rb до строки "fixtures: all":

class ActiveSupport::TestCase

  self.use_transactional_fixtures = true
  .
  .
  .
  set_fixture_class :my_table_name => "MyModule::MyClass"

  fixtures :all

end

В этом случае файл fixtures следует называть my_table_name.yml

Ответ 2

ПРИМЕЧАНИЕ. Было бы полезно включить трассировку стека и полное сообщение об ошибке.

В вашем классе test/test_helper.rb есть строка типа

fixtures :all

Это говорит о том, что структура должна искать в test/fixtures каталога и пытаться загрузить каждый из файлов YAML, которые он там видит, а затем сохранить их в БД. Поэтому я подозреваю, что у вас есть файл, который не имеет класса в app/models с уникальным именем. Другими словами, если есть файл test/fixtures/posts.yml, то при запуске тестов среда будет искать класс с именем Post для загрузки ваших данных.

Итак, первое, что я хотел бы сделать, это проверить, есть ли у вас файл fixture, который не связан с одним из ваших классов моделей (возможно, вы удалили модель, но забыли удалить прибор?)

Если это не сработает, попробуйте изменить строку в тестовом помощнике, чтобы явно загрузить необходимые вам приборы. Поэтому, если вы хотите загрузить светильники для объекта с именем Post и объекта с именем User, вы измените:

fixtures :all

к

fixtures :posts, :users

в test_helper.rb, и вы увидите, что ошибка исчезла (хотя теперь могут появляться другие ошибки, потому что ваши приборы не загружены.

Ответ 3

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

Ответ 4

В случае, когда класс является нерегулярным классом с точки зрения наименования, такого как fish, sms он мог быть создан с помощью флага --force-plural т.е. rails g model sms --force-plural

в этом случае вы настроили перегиб, который настроен под config/initializers/inflections.rb

примером такого является

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.plural /^(ox)$/i, '\1en'
  inflect.singular /^(ox)en/i, '\1'
  inflect.irregular 'person', 'people'
  inflect.uncountable %w( fish sheep )
end

Таким образом, класс может быть распознан, как вы его объявили