【发布时间】:2011-08-11 03:26:39
【问题描述】:
运行测试时出现此错误:
FixtureClassNotFound: No class attached to find
是什么导致了这个错误以及如何修复它?
【问题讨论】:
运行测试时出现此错误:
FixtureClassNotFound: No class attached to find
是什么导致了这个错误以及如何修复它?
【问题讨论】:
这很可能是因为自定义表名用于模型(使用 set_table_name)或模型位于模块中。
要解决,您需要在test_helper.rb 的fixtures :all 行之前添加一个set_fixture_class 行:
class ActiveSupport::TestCase
self.use_transactional_fixtures = true
.
.
.
set_fixture_class my_table_name: MyModule::MyClass
fixtures :all
end
在这种情况下,fixtures 文件应该被命名为 my_table_name.yml
【讨论】:
set_fixture_class my_table_name: MyModule::MyClass
注意:如果您包含堆栈跟踪和完整的错误消息会很有帮助。
在你的 test/test_helper.rb 类中,有一行像
fixtures :all
这告诉框架查看目录 test/fixtures 并尝试加载它在其中看到的每个 YAML 文件,然后将它们保存到数据库中。所以我的预感是你有一个文件,它在 app/models 中没有具有单数化名称的类。换句话说,如果有一个文件 test/fixtures/posts.yml,那么当你运行你的测试时,框架会寻找一个名为 Post 的类来加载你的数据。
所以我要做的第一件事是检查您是否有一个与您的模型类无关的夹具文件(也许您删除了模型但忘记删除夹具?)
如果这不起作用,请尝试更改测试助手中的行以显式加载您需要的固定装置。所以如果你只想为一个名为 Post 的对象和一个名为 User 的对象加载fixture,你将改变:
fixtures :all
到
fixtures :posts, :users
在 test_helper.rb 中,您应该会看到错误消失(尽管现在可能会出现其他错误,因为您的设备未加载。0
【讨论】:
如果该类在命名方面是一个不规则的类,例如fish,sms
它可以通过使用 --force-plural 标志创建
IE
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
这样,你声明的类就可以被识别出来
【讨论】:
当我在生成一些脚手架代码时出错时收到此错误。我使用了复数型号名称,我猜这只是混淆了夹具加载。使用单一模型名称重新生成脚手架解决了该问题。
【讨论】: