cas*_*t01 5 ruby-on-rails rails-engines ruby-on-rails-4 factory-bot
我已经创建了一个rails引擎(完整的,不可安装的)来为许多不同的rails应用程序提供模型.我使用Factory Girl Rails来测试这个引擎,测试对于引擎本身都运行良好.
我现在希望能够在包含此引擎的其他应用程序中使用这些工厂.
Gemspec的依赖关系如下所示:
s.add_dependency "rails", "~> 4.0.3"
s.add_dependency "mysql2", "~> 0.3.15"
s.add_development_dependency "rspec-rails", "~> 3.0.0.beta"
s.add_development_dependency "factory_girl_rails", "~> 4.4.1"
s.add_development_dependency "shoulda-matchers", "~> 2.5.0"
Run Code Online (Sandbox Code Playgroud)
我在/spec/factories.rb中定义了我的工厂:
factory :user do
...
end
Run Code Online (Sandbox Code Playgroud)
要将factories.rb添加到factory girl中的定义路径,我将以下内容添加到我的/lib/engine_name/engine.rb文件中:
class Engine < ::Rails::Engine
initializer "model_core.factories", :after => "factory_girl.set_factory_paths" do
FactoryGirl.definition_file_paths << File.expand_path('../../../spec/factories.rb', __FILE__) if defined?(FactoryGirl)
end
end
Run Code Online (Sandbox Code Playgroud)
在我的rails应用程序中,我通过将以下内容添加到Gemfile来包含引擎:
gem 'engine_name', git: "<GIT_LOCATION>"
Run Code Online (Sandbox Code Playgroud)
我还将factory_girl_rails添加到应用程序中(有没有一种方法可以从引擎中公开它?而不是必须在应用程序Gemfile中指定它?).
并且在spec_helper.rb中要求工厂女孩栏:
require 'factory_girl_rails'
Run Code Online (Sandbox Code Playgroud)
现在,当我写下一个控制器测试时,如下所示:
it "saves the user to the database" do
expect{post :create, user: attributes_for(:user)}.to change{User.count}.by(1)
end
Run Code Online (Sandbox Code Playgroud)
我收到错误:"工厂未注册:用户"
我通过打开ruby控制台并运行来仔细检查工厂女孩定义文件路径FactoryGirl.definition_file_paths,我可以在输出中看到来自引擎的factories.rb:"/ home/.../gems/engine-name-abc123/spec /factories.rb"
为了使这些工厂可用,还有什么我需要做的吗?
(我在stackoverflow及其他方面发现了一些类似的问题,似乎都指向在engine.rb中添加这些行,或者在factories.rb中指定名称空间,但我没有使用带有此引擎的名称空间.)
我发现最简单的方法是添加一个安装生成器,只需复制工厂即可。我还让生成器运行安装迁移 rake 任务,因为我在使用该引擎的任何应用程序中都需要这些任务。
所以,在lib/generators/my_engine/install/install_generator.rb:
module MyEngine
module Generators
class InstallGenerator < Rails::Generators::Base
source_root File.expand_path('../templates', __FILE__)
def copy_migrations
rake("my_engine:install:migrations")
end
def copy_factories
copy_file "../path/to/spec/factories.rb", "spec/factories.rb"
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,在使用此引擎的项目中,我只需运行rails generate my_engine:install,工厂(和迁移)就可供我使用。
| 归档时间: |
|
| 查看次数: |
1331 次 |
| 最近记录: |