你如何解决FixtureClassNotFound:找不到附加的类

问题描述 投票:10回答:4

运行我的测试时出现此错误:

FixtureClassNotFound: No class attached to find

是什么导致此错误以及如何解决?

ruby-on-rails-3 fixtures
4个回答
25
投票

很可能发生这种情况是因为自定义表名用于模型(使用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


1
投票

注意:如果您包含堆栈跟踪和完整错误消息,将会很有帮助。

在你的test / test_helper.rb类中,有一行代码

fixtures :all

这告诉框架查看目录test / fixtures并尝试加载它在那里看到的每个YAML文件,然后将它们保存到DB。所以我的预感是你有一个文件在app / models中没有带有单一名称的类。换句话说,如果有一个文件test / fixtures / posts.yml,那么当你运行测试时,框架将寻找一个名为Post的类来加载你的数据。

所以我要做的第一件事就是检查你是否有一个与你的某个模型类没有关联的夹具文件(也许你删除了一个模型但是忘了删除夹具?)

如果这不起作用,请尝试更改测试助手中的行以显式加载所需的灯具。因此,如果您只想为名为Post的对象和名为User的对象加载fixture,您将更改:

fixtures :all

fixtures :posts, :users

在test_helper.rb中,您应该会看到错误消失(尽管现在可能会出现其他错误,因为您的灯具未加载。


0
投票

当我生成一些脚手架代码时出错,我收到了这个错误。我使用了多个模型名称,这只是混淆了夹具加载,我想。使用单一模型名称重新生成脚手架可以解决问题。


0
投票

在类别为fishsms等命名方面的类是不规则的事件,它可以通过使用--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

通过这种方式,可以在声明类时识别它

© www.soinside.com 2019 - 2024. All rights reserved.