运行我的测试时出现此错误:
FixtureClassNotFound: No class attached to find
是什么导致此错误以及如何解决?
很可能发生这种情况是因为自定义表名用于模型(使用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
注意:如果您包含堆栈跟踪和完整错误消息,将会很有帮助。
在你的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中,您应该会看到错误消失(尽管现在可能会出现其他错误,因为您的灯具未加载。
当我生成一些脚手架代码时出错,我收到了这个错误。我使用了多个模型名称,这只是混淆了夹具加载,我想。使用单一模型名称重新生成脚手架可以解决问题。
在类别为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
通过这种方式,可以在声明类时识别它