【问题标题】:Factory Girl: uninitialized constantFactory Girl:未初始化的常量
【发布时间】:2013-01-18 00:00:02
【问题描述】:

我有一个工厂,例如:

FactoryGirl.define do
  factory :page do
    title 'Fake Title For Page'
  end
end

还有一个测试:

describe "LandingPages" do
    it "should load the landing page with the correct data" do
        page = FactoryGirl.create(:page)
        visit page_path(page)
    end
end

我的 spec_helper.rb 包含:

require 'factory_girl_rails' 

但我不断得到:

LandingPages should load the landing page with the correct data
     Failure/Error: page = FactoryGirl.create(:page)
     NameError:
       uninitialized constant Page
     # ./spec/features/landing_pages_spec.rb:5:in `block (2 levels) in <top (required)>'

这是一个新项目,所以我不认为测试实际上是问题所在。我相信它可能设置不正确。有什么想法可以尝试和/或在哪里解决这个问题?

我平静的 pages.rb 文件:

class Pages < ActiveRecord::Base
  # attr_accessible :title, :body
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rspec2 factory-bot


    【解决方案1】:

    从您的文件名来看,该模型实际上名为 LandingPage。工厂试图根据你给它的名字来猜测你的类名。所以 :page 变成了 Page。

    您可以更改工厂名称,也可以添加显式类选项:

    FactoryGirl.define do
      factory :landing_page do
        title 'Fake Title For Page'
      end
    end
    

    FactoryGirl.define do
      factory :page, :class => LandingPage do
        title 'Fake Title For Page'
      end
    end
    

    【讨论】:

    • 我已将文件重命名为 pages_spec.rb。我仍然有问题。我刚刚测试了它是否可以在测试环境中工作,我得到了以下信息:1.9.3p362 :003 &gt; FactoryGirl.create(:page) NameError: uninitialized constant Page
    • 这绝对应该是公认的答案。问题是 FactoryGirl 试图猜测类名,这对于类似的多个工厂(同一个类)可能会导致有趣的名称,从而导致问题。
    【解决方案2】:

    您的模型名称似乎是复数形式:Pages。这应该是单数:Page。您还需要将文件重命名为app/models/page.rb。 FactoryGirl 假设一个单一的模型名称。

    【讨论】:

    • 当你定义一个不使用模型的工厂时,你也会得到这个错误。在这种情况下,您可以执行以下操作:factory :page, class: OpenStruct
    • @AmericoSavinon 这就是我的问题。 +1
    • @AmericoSavinon 的评论解决了我的问题并澄清了这个概念.. 谢谢.. :)
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多