18

我从事的项目结构如下:

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

在这个项目中,应用程序逻辑、gem 等都在core应用程序中。我已经boxes为 rspec 设置了这样的:

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 not registered:cubic. 我尝试在 spec_helper.rb 中要求 factory_girl_rails。我试过修改 spec_helper.rb w/

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

中的 gemfilecore包含gem 'factory_girl_rails'在开发、测试组中。我什至试图让工厂提出错误,但这甚至没有发生。因此,工厂似乎甚至没有被加载。我需要做什么才能加载和注册这个工厂?

4

4 回答 4

16

您需要帮助虚拟应用程序(或 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.

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

├── 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

我将 factory-girl-rails gem 包含在我的 gemspec 中,并且仅在那个位置。我的 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'
于 2014-01-23T08:33:13.257 回答
11

这就是我们如何解决它。正如@Vinh Tran 建议的那样,factory_girl_rails确实需要在Gemfile您正在开发的应用程序中:

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

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

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

于 2013-10-16T20:15:03.943 回答
2

当我的规范没有以 . 结尾时,我得到了这个_spec.rb。RubyMine 运行单元测试没有任何问题,除了 Factory Girl 之外,一切正常。

于 2014-08-28T01:24:09.163 回答
1

您可以尝试 2 件事:

  • gem 'factory_girl_rails'里面的boxes应用
  • 使用工厂在核心内创建一个示例 rspec 并运行它

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

于 2013-10-11T10:47:39.160 回答