我处理的项目结构如下:
projects/warehouse/core
projects/warehouse/products/bottles
projects/warehouse/products/boxes
在这个项目中,应用程序逻辑,gems等都在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未注册: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'
。我甚至试图让工厂提出错误,但这甚至都没发生。因此,工厂似乎甚至没有加载。如何加载和注册此工厂需要做什么?
答案 0 :(得分:14)
你需要帮助虚拟app(或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,以便在开发过程中方便地创建测试对象。</ p>
TLDR 将此代码添加到虚拟应用的应用程序中.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
我只在我的gemspec中包含了factory-girl-rails gem,并且仅在该位置。 我的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'
答案 1 :(得分:11)
以下是我们如何解决这个问题。正如@Vinh Tran建议的那样,factory_girl_rails
确实需要在您正在处理的应用的Gemfile
范围内:
group :development, :test do
gem 'rspec-rails'
gem 'factory_girl_rails'
end
此外,虚拟应用程序需要位于/spec
目录下,尽管此时它似乎没有填充实际模型等。
最后,rspec
命令需要从boxes
目录发出,而不是core
目录。所有这些结合在一起使我们能够成功注册工厂并成功进行试运行。
答案 2 :(得分:1)
当我的规范没有以_spec.rb
结尾时,我得到了这个。 RubyMine毫无问题地进行了单元测试,除了Factory Girl之外,其他一切都有效。
答案 3 :(得分:0)
gem 'factory_girl_rails'
放入boxes
app 我认为您的boxes
应用不会从核心加载宝石,只是加载业务逻辑