Rails 3.2,RSpec,Factory Girl: NameError:未初始化的常量工厂

40

我一直在跟随这个介绍Rails测试的教程做学习,但遇到了一个问题,似乎找不到解决方案。我对Rails非常熟悉,但这是我第一次尝试进行测试。

无论如何,我有一个非常基本的模型测试,甚至还没有完全实现,当我尝试运行rspec spec/models/admin_spec.rb时,我会在Admin has a valid factory行(完整代码如下)中得到以下错误消息:

Admin has a valid factory
 Failure/Error: Factory.create(:admin).should be_valid
 NameError:
   uninitialized constant Factory
 # ./spec/models/admin_spec.rb:6:in `block (2 levels) in <top (required)>'

我猜测 FactoryGirl 没有被加载,但我印象中它应该会自动加载。下面是来自我的 Gemfile、/spec/models/admin_spec.rb 和 /spec/factories/admins.rb 的完整代码。

非常感谢您的帮助。

Gemfile

source 'https://rubygems.org'

gem 'rails', '3.2.2'
gem 'mysql2'
gem 'jquery-rails'
gem 'haml'
gem 'bcrypt-ruby', :require => 'bcrypt'
gem 'bootstrap-sass', '~> 2.0.2'
gem 'capistrano'
gem 'json'
gem "paperclip", '~>3.0'
gem 'airbrake'
gem 'acts_as_list'
gem 'nested_form', :git => 'https://github.com/ryanb/nested_form.git'
gem 'bootstrap-wysihtml5-rails'
gem 'will_paginate', '~> 3.0'
gem 'bootstrap-will_paginate'
gem 'thinking-sphinx', '2.0.10'

gem 'sass-rails', '~> 3.1'
gem 'coffee-rails'
gem 'uglifier'
# gem 'compass'

group :development do
  gem 'awesome_print'
  gem 'wirble'
end

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end

group :production do
  gem 'execjs'
  gem 'therubyracer'
end

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
  gem 'faker'
  gem 'capybara'
  gem 'guard-rspec'
  gem 'launchy'
end

/spec/factories/admin.rb

require 'faker'

FactoryGirl.define do
  factory :admin do |f|
    f.name Faker::Name.name
    f.email Faker::Internet.email
  end
end

/spec/models/admin_spec.rb

require 'spec_helper'

describe Admin do
  it "has a valid factory" do
    Factory.create(:admin).should be_valid
  end
  it "is invalid without a name"
  it "is invalid without an email"
end
4个回答

122

应该使用FactoryGirl.create代替。显然,Factory已被弃用并已被移除,请查看您提供的链接中的注释 :)


啊哈,非常感谢。我在页面上搜索了“未初始化的常量工厂错误”,但没有仔细阅读。我感觉这应该是一些简单的问题。再次感谢。 - chrisgooley

10

实际上,在spec_helper.rb文件中的Rspec.configure do...end代码块下,你可以添加以下内容:

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end 
这将会省去你在使用:build:create之前需要加上FactoryGirl.前缀的麻烦:

require 'spec_helper'


require 'spec_helper'

describe Admin do
  it "has a valid factory" do
    create(:admin).should be_valid
  end
  it "is invalid without a name"
  it "is invalid without an email"
end

参考:FactoryGirl文档


9

这不是关于你问题的回答,但是我注意到你在使用Faker和FactoryGirl时存在一个隐蔽的错误。f.namef.email会在每个FactoryGirl.create或FactoryGirl.build中都是相同的。

f.name Faker::Name.name
f.email Faker::Internet.email

在Faker调用周围添加花括号,以便每个对工厂的引用都会生成随机的Faker数据。
f.name { Faker::Name.name }
f.email { Faker::Internet.email }

啊,是的,我后来在审查我的代码时发现了那个问题,但无论如何还是谢谢你提醒我。 - chrisgooley
谢谢您!这是个愚蠢的错误,但很容易被忽略。 - rpearce

1
此外,请确保在您的spec_helper.rb文件中包含了require语句。
require 'factory_girl_rails'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接