18

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

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

このプロジェクトでは、アプリケーション ロジック、gem などはすべて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 not registered: Cubase が発生します。spec_helper.rb で factory_girl_rails を要求しようとしました。spec_helper.rb w/ を変更してみました

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

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

4

4 に答える 4

16

FactoryGirl は、spec/dummy である Rails.root を参照するため、ダミー アプリ (または Rails コンソール) を支援する必要があります。

たとえば、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 ジェムをジェムスペックにのみ、その場所にのみ含めています。私の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 に答える