Rails 3 Factory_Girl Factory未注册

时间:2013-04-17 16:01:57

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

我必须承认我是新手测试,所以我正在尝试使用Factory Girl测试我的前几个Rspec。一切顺利,直到我尝试使用工厂女孩。

我的配置如下

规格/ spec_helper.rb

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'database_cleaner'
require 'factory_girl_rails'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"

  config.include FactoryGirl::Syntax::Methods

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end

规格/模型/ role_spec.rb

require 'spec_helper'

describe Role do
  it "is valid" do
    role = FactoryGirl.build(:role)
    expect(role).to be_valid
  end
end

规格/ factories.rb

FactoryGirl.define do   
  factory :role do
    rolesymbol "tst-admin"
    name "test admin"
  end
end

然而,当我运行bundle exec rspec或rake spec时,我收到以下错误

Failures:

  1) Role is valid
     Failure/Error: role = FactoryGirl.build(:role)
     ArgumentError:
       Factory not registered: role
     # ./spec/models/role_spec.rb:12:in `block (2 levels) in <top (required)>'

对我来说,FactoryGirl似乎正在工作,角色定义正确,并且规范通常有效,所以我不知道发生了什么。有什么想法吗?

迈克尔

3 个答案:

答案 0 :(得分:1)

我参加派对的时间有点迟了,但在Rails引擎中尝试使用带有RSpec的FactoryGirl时遇到了同样的问题。我通过在spec / spec_helper.rb文件中明确设置工厂女孩定义路径来解决问题

FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
FactoryGirl.find_definitions

目录结构正如您所期望的那样:

root/
  spec/
    spec_helper.rb
    a_spec_file.rb
    factories/
      my_factory.rb

根据FactoryGirl文档,这个结构应该开箱即用(https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#defining-factories)。我没有调查为什么对我来说不是这样的。 (关于SO的第一个回复,如果这里有任何错误,请道歉!)

答案 1 :(得分:0)

尝试将require'factory_girl'添加到您的factories.rb?

答案 2 :(得分:-1)

我甚至稍后参加了聚会,但是我通过将factories目录移动到spec/support/factories的(现在)更标准的路径来解决这个问题 - 现在,rspec已经无需进一步了解它需要告诉它在哪里看。