私は次のような構造のプロジェクトに取り組んでいます。
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'
が含まれています。工場でエラーを発生させようとしたのですが、それも起こりません。したがって、ファクトリはロードされていないように見えます。このファクトリをロードして登録するにはどうすればよいですか?
これが私たちがそれを回避した方法です。 @Vinh Tranが提案したように、factory_girl_Rails
は、作業中のアプリのGemfile
内にある必要があります。
group :development, :test do
gem 'rspec-Rails'
gem 'factory_girl_Rails'
end
さらに、ダミーアプリは/spec
ディレクトリの下に配置する必要がありますが、現時点では、実際のモデルなどが入力されているようには見えません。
最後に、rspec
コマンドは、boxes
ディレクトリではなくcore
ディレクトリから発行する必要があります。これらすべてを組み合わせることで、工場の登録とテストの実行に成功しました。
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'
スペックが_spec.rb
で終わっていないときにこれを取得しました。 RubyMineは問題なく単体テストを実行し、FactoryGirlを除いてすべてが機能しました。
あなたが試すことができる2つのこと:
gem 'factory_girl_Rails'
をboxes
アプリ内に配置するboxes
アプリはコアからgemをロードせず、ビジネスロジックをロードするだけだと思います