Podczas uruchamiania moich testów otrzymuję ten błąd:W jaki sposób można rozwiązać FixtureClassNotFound: Brak klasy dołączony znaleźć
FixtureClassNotFound: No class attached to find
Co powoduje ten błąd i jak go naprawić?
Podczas uruchamiania moich testów otrzymuję ten błąd:W jaki sposób można rozwiązać FixtureClassNotFound: Brak klasy dołączony znaleźć
FixtureClassNotFound: No class attached to find
Co powoduje ten błąd i jak go naprawić?
Najprawdopodobniej dzieje, ponieważ nazwa zwyczaj tabela jest używana dla modelu (przy użyciu set_table_name) lub model jest w module.
Aby rozwiązać, trzeba dodać linię set_fixture_class w test_helper.rb przed „opraw: all” wiersz:
class ActiveSupport::TestCase
self.use_transactional_fixtures = true
.
.
.
set_fixture_class :my_table_name => "MyModule::MyClass"
fixtures :all
end
w tym przypadku plik Oprawy powinny być nazywane my_table_name.yml
UWAGA: Byłoby pomocne, gdyby dołączyć ślad stosu i pełny komunikat o błędzie.
W swojej klasie test/test_helper.rb, istnieje linia jak
fixtures :all
Mówi ramy szukać w teście katalogu/opraw i spróbuj załadować każdy z plików YAML, że widzi tam a następnie zapisz je w DB. Więc moim przeczuciem jest to, że masz tam plik, który nie ma klasy w aplikacjach/modelach o zindywidualizowanej nazwie. Innymi słowy, jeśli istnieje plik test/fixtures/posts.yml, to po uruchomieniu testów framework będzie szukał klasy o nazwie Post, aby załadować dane.
Pierwszą rzeczą, którą zrobiłbym to sprawdź, czy masz plik urządzenia, który nie jest powiązany z jedną z twoich klas modelu (może usunąłeś model, ale zapomniałeś usunąć urządzenie?)
Jeśli to nie działa, spróbuj zmienić linię Twój pomocnik testowy do jawnego załadowania potrzebnych urządzeń. Więc jeśli tylko chcesz załadować osprzętu dla obiektu o nazwie post i obiekt o nazwie użytkownika, można zmienić:
fixtures :all
do
fixtures :posts, :users
w test_helper.rb i powinien pojawić się błąd odejść (chociaż inne błędy mogą się pojawić, ponieważ twoje uchwyty nie są loaded.0
Dzięki za odpowiedź Rob. Tak naprawdę znalazłem rozwiązanie i dodałem jako odpowiedź tutaj. –
Zauważ, że jeśli masz "fixtures: all" w wielu plikach testowych jednostek, musisz umieścić także set_fixture_class w każdym pliku, nie tylko w miejscach, w których zamierzasz używać urządzeń z tego modelu. To mnie naprawdę zdezorientowało, ale ma sens po kawie. Wolę, żeby jakoś ta informacja była SUCHA w samym modelu. – mcr
I Mam ten błąd, gdy popełniłem błąd, generując kod rusztowania. Użyłem nazwy w liczbie mnogiej, a to tylko myliło ładowanie urządzenia, tak myślę. Regeneracja rusztowania z pojedynczą nazwą modelu rozwiązała problem.
W przypadku, gdy klasa jest nieregularny klasa pod względem nazewnictwa, takich jak fish
, sms
mogłoby zostały utworzone za pomocą --force-plural
flagę ja.e rails g model sms --force-plural
w tym przypadku byłoby skonfigurowaniu przegięcie, która jest tworzona na podstawie config/initializers/inflections.rb
Przykładem takiego jest ten
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
W ten sposób klasa może być uznana za ciebie oświadczył to
Jeśli twoja klasa nie jest w module (twoja odpowiedź nie jest w 100% jednoznaczna) może to być spowodowane dziwną nazwą modelu, której inflector Railsów nie wie, w jaki sposób poprawnie się leczyć. W takim przypadku lepiej byłoby dodać niestandardowy fleks w config/initializers/inflections.rb, ponieważ może to powodować problemy również w innych obszarach. – hermannloose
Zostałem zwrócony ten sam błąd po dodaniu tego wiersza Mój błąd został zmieniony na ArgumentError: ArgumentError: porównanie String z Class failed – wasipeer
@wasipeer: spróbuj 'set_fixture_class my_table_name: MyModule :: MyClass' –