Rspec 工厂女孩:工厂没有注册

Rspec 工厂女孩:工厂没有注册,rspec,ruby-on-rails-3.2,factory-bot,Rspec,Ruby On Rails 3.2,Factory Bot,我从事的项目结构如下: projects/warehouse/core projects/warehouse/products/bottles projects/warehouse/products/boxes 在这个项目中,应用程序逻辑、gem等都在核心应用程序中。我为rspec设置了框,例如: projects/warehouse/products/boxes/spec /factories /models factories目录包含cubics.rb: FactoryG

我从事的项目结构如下:

projects/warehouse/core
projects/warehouse/products/bottles
projects/warehouse/products/boxes
在这个项目中,应用程序逻辑、gem等都在
核心
应用程序中。我为rspec设置了
,例如:

projects/warehouse/products/boxes/spec
    /factories
    /models
factories
目录包含
cubics.rb

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

describe Boxes::Cubic do
  it "has a valid factory" do
    FactoryGirl.create(:cubic).should be_valid
  end
end
models
目录包含
cubic\u spec.rb

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

describe Boxes::Cubic do
  it "has a valid factory" do
    FactoryGirl.create(:cubic).should be_valid
  end
end
Cubic
模型位于
products/box/app/models/box/Cubic.rb

module Boxes
  class Cubic < BoxExBase
    self.table_name = 'containers'
    #validation stuff goes here
  end
end
core
中的gem文件在开发、测试组中包含
gem'factory\u girl\u rails'
。我甚至试图让工厂提出一个错误,但那根本没有发生。因此,这家工厂似乎根本就没有装货。我需要做什么才能加载并注册此工厂?

您可以尝试以下两种方法:

  • gem'factory\u girl\u rails'
    放入
    框中
    应用程序
  • 使用factory在堆芯内部创建一个样本rspec并运行它

我认为你的
应用程序并没有从核心加载宝石,它只是加载业务逻辑。正如@Vinh Tran所建议的,
factory\u girl\u rails
确实需要在您正在使用的应用程序的
Gemfile
中:

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end
此外,虚拟应用程序需要位于
/spec
目录下,尽管在这一点上,它似乎没有填充实际的模型,等等


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

您需要帮助虚拟应用程序(或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,以便在开发过程中方便地创建测试对象

TLDR将此代码添加到虚拟应用程序的application.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.

当我的规范没有以
\u spec.rb
结尾时,我得到了这个。RubyMine毫无问题地运行了单元测试,除Factory Girl外,其他一切正常。

谢谢!我马上给你打一针。我暂时被重新安排了。我对延迟表示歉意,但将宝石放入盒子应用程序没有任何影响。当使用工厂时,rspec在内核中工作。将gem放入
框中时,您遇到了什么错误?相同错误
FactoryNotRegistered
?相同错误。一位同事已经想出了解决办法。我很快就会发帖的。
  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'