FactoryGirl:工厂未注册

时间:2013-10-10 14:48:58

标签: rspec ruby-on-rails-3.2 factory-bot

我处理的项目结构如下:

projects/warehouse/core
projects/warehouse/products/bottles
projects/warehouse/products/boxes

在这个项目中,应用程序逻辑,gems等都在core应用程序中。我为rspec设置了boxes,如下所示:

projects/warehouse/products/boxes/spec
    /factories
    /models

factories目录包含cubics.rb

FactoryGirl.define do
  factory :cubic
    id 1
    dimension 12
  end
end

models目录包含cubic_spec.rb

require 'spec_helper'

describe Boxes::Cubic do
  it "has a valid factory" do
    FactoryGirl.create(:cubic).should be_valid
  end
end

Cubic模型位于products/boxes/app/models/boxes/cubic.rb

module Boxes
  class Cubic < BoxExBase
    self.table_name = 'containers'
    #validation stuff goes here
  end
end

简单明了。当我执行rspec ../products/boxes/spec/models/cubic_spec.rb时,我得到了ArgumentError:Factory未注册:cubic。我已经尝试在spec_helper.rb中要求factory_girl_rails。我已经尝试修改spec_helper.rb w /

FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
FactoryGirl.find_definitions

core中的gemfile包含开发测试组中的gem 'factory_girl_rails'。我甚至试图让工厂提出错误,但这甚至都没发生。因此,工厂似乎甚至没有加载。如何加载和注册此工厂需要做什么?

4 个答案:

答案 0 :(得分:14)

你需要帮助虚拟app(或rails控制台),因为FactoryGirl会查看Rails.root,这是spec / dummy。

所以,从spec / dummy启动的控制台中举例来说就是这样做:

FactoryGirl.definition_file_paths = %w(../factories)
FactoryGirl.find_definitions
# You can use this line to see what factories are loaded
# FactoryGirl.factories

对于您的特定情况,您需要更改实际位置,但如果您在哪里,如果FactoryGirl没有找到您的工厂,那是因为它不知道在哪里看。

具体来说:这就是我所做的。我的需求如下 - 我需要从Gem根目录运行rspec。但我还需要能够从嵌入式虚拟项目中运行rails控制台并访问Factory girl,以便在开发过程中方便地创建测试对象。<​​/ p>

TLDR 将此代码添加到虚拟应用的应用程序中.rb

 console do
   FactoryGirl.definition_file_paths << Pathname.new("../factories")
   FactoryGirl.definition_file_paths.uniq!
   FactoryGirl.find_definitions
 end

├── spec
│   ├── dummy
│   │   ├── app
│   │   ├── bin
│   │   ├── config
│   │   │   ├── environments
│   │   │   ├── initializers
│   │   │   ├── locales
│   │   │   ├── application.rb << This is the file to add the lines in.

我的应用程序布局的相关部分看起来像

├── app
├── bin
├── config
├── lib
├── spec
│   ├── dummy
│   │   ├── app
│   │   ├── bin
│   │   ├── config
│   │   │   ├── environments
│   │   │   ├── initializers
│   │   │   ├── locales
│   │   │   ├── application.rb
│   │   │   ├── boot.rb
│   │   │   ├── database.yml
│   │   │   ├── environment.rb
│   │   │   └── routes.rb
...
│   ├── factories
│   │   └── models
│   │       └── api_requests.rb
│   ├── lib
│   │   ├── controllers
│   │   │   ├── controller_spec.rb
│   │   │   └── session__spec.rb
│   │   └── my_spec.rb
│   ├── support
│   └── vcr
│   ├── spec_helper.rb

├── Gemfile
├── Gemfile.lock
├── mygem.gemspec  << this is the file to include the factory-girl-rails gem

我只在我的gemspec中包含了factory-girl-rails gem,并且仅在该位置。 我的Gemfile中没有任何内容,虚拟应用程序的Gemfile中没有任何内容。

  s.add_development_dependency 'rspec-rails'
  s.add_development_dependency 'capybara'
  s.add_development_dependency 'factory_girl_rails'
  s.add_development_dependency 'shoulda'
  s.add_development_dependency 'vcr'
  s.add_development_dependency 'byebug'
  s.add_development_dependency 'better_errors'
  s.add_development_dependency 'binding_of_caller'

答案 1 :(得分:11)

以下是我们如何解决这个问题。正如@Vinh Tran建议的那样,factory_girl_rails确实需要在您正在处理的应用的Gemfile范围内:

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

此外,虚拟应用程序需要位于/spec目录下,尽管此时它似乎没有填充实际模型等。

最后,rspec命令需要从boxes目录发出,而不是core目录。所有这些结合在一起使我们能够成功注册工厂并成功进行试运行。

答案 2 :(得分:1)

当我的规范没有以_spec.rb结尾时,我得到了这个。 RubyMine毫无问题地进行了单元测试,除了Factory Girl之外,其他一切都有效。

答案 3 :(得分:0)

你可以尝试两件事:

  • gem 'factory_girl_rails'放入boxes app
  • 使用工厂在核心内创建一个示例rspec并运行它

我认为您的boxes应用不会从核心加载宝石,只是加载业务逻辑