web-dev-qa-db-ja.com

FactoryGirl:工場は登録されていません

私は次のような構造のプロジェクトに取り組んでいます。

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

coreのgemfileには、開発、テストグループのgem 'factory_girl_Rails'が含まれています。工場でエラーを発生させようとしたのですが、それも起こりません。したがって、ファクトリはロードされていないように見えます。このファクトリをロードして登録するにはどうすればよいですか?

17
CitizenX

これが私たちがそれを回避した方法です。 @Vinh Tranが提案したように、factory_girl_Railsは、作業中のアプリのGemfile内にある必要があります。

group :development, :test do
  gem 'rspec-Rails'
  gem 'factory_girl_Rails'
end

さらに、ダミーアプリは/specディレクトリの下に配置する必要がありますが、現時点では、実際のモデルなどが入力されているようには見えません。

最後に、rspecコマンドは、boxesディレクトリではなくcoreディレクトリから発行する必要があります。これらすべてを組み合わせることで、工場の登録とテストの実行に成功しました。

11
CitizenX

FactoryGirlはスペック/ダミーであるRails.rootを調べるため、ダミーアプリ(またはRailsコンソール)を支援する必要があります。

したがって、たとえばスペック/ダミーで起動されたコンソールから、次のようにします。

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コンソールを実行し、開発中に便利なテストオブジェクトを作成するためにFactorygirlにアクセスできる必要もあります。

[〜#〜] 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-Railsgemを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'
14
Ashley Raiteri

スペックが_spec.rbで終わっていないときにこれを取得しました。 RubyMineは問題なく単体テストを実行し、FactoryGirlを除いてすべてが機能しました。

2
Nowaker

あなたが試すことができる2つのこと:

  • gem 'factory_girl_Rails'boxesアプリ内に配置する
  • ファクトリを使用してコア内にサンプルrspecを作成し、実行します

boxesアプリはコアからgemをロードせず、ビジネスロジックをロードするだけだと思います

1
Vinh Tran