【问题标题】:How do you solve FixtureClassNotFound: No class attached to find你如何解决 FixtureClassNotFound: No class attached to find
【发布时间】:2011-08-11 03:26:39
【问题描述】:

运行测试时出现此错误:

FixtureClassNotFound: No class attached to find

是什么导致了这个错误以及如何修复它?

【问题讨论】:

    标签: ruby-on-rails-3 fixtures


    【解决方案1】:

    这很可能是因为自定义表名用于模型(使用 set_table_name)或模型位于模块中。

    要解决,您需要在test_helper.rbfixtures :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

    【讨论】:

    • 如果您的课程不在模块中(您的答案不是 100% 清楚),这可能是由于 Rails 的变形器不知道如何正确单数化的奇怪模型名称。在这种情况下,您最好在 config/initializers/inflections.rb 中添加自定义拐点,因为它也可能在其他领域引起问题。
    • 添加此行后我遇到了同样的错误我的错误更改为 ArgumentError: ArgumentError: 字符串与类的比较失败
    • @wasipeer:试试set_fixture_class my_table_name: MyModule::MyClass
    【解决方案2】:

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

    在你的 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

    【讨论】:

    • 感谢罗布的回答。我实际上找到了解决方案并将其添加为此处的答案。
    • 请注意,如果您在许多单元测试文件中都有“fixtures :all”,那么您还必须将 set_fixture_class 放入每个文件中,而不仅仅是在您要使用该文件的地方模型。这真的让我很困惑,但在咖啡之后确实有意义。我宁愿以某种方式将这些信息干燥到模型本身中。
    【解决方案3】:

    如果该类在命名方面是一个不规则的类,例如fishsms 它可以通过使用 --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
    

    这样,你声明的类就可以被识别出来

    【讨论】:

      【解决方案4】:

      当我在生成一些脚手架代码时出错时收到此错误。我使用了复数型号名称,我猜这只是混淆了夹具加载。使用单一模型名称重新生成脚手架解决了该问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多