我有一个包括一些工厂的宝石.宝石看起来像:
- .
- ├── Gemfile
- ├── Gemfile.lock
- ├── README.md
- ├── Rakefile
- ├── db
- ├── lib
- │ ├── models
- │ │ ├── users.rb
- ├── pkg
- ├── core.gemspec
- ├── spec
- │ ├── factories
- │ │ └── users.rb
- │ ├── fixtures
- │ ├── helpers
- │ ├── integration
- │ ├── spec_helper.rb
- │ ├── support│ │
- │ └── unit
- │ └── users_spec.rb
- └── tasks
现在我在另一个Ruby项目(Grape)中使用gem来添加像gem’core’,git:’https://url.git’这样的东西.
现在一切都正常,因为我可以使用Grape项目的用户模型.
不过,我想使用工厂(用户),所以我可以为Grape项目编写进一步的集成测试.
在Grape项目中,在spec_helper.rb中,它看起来像:
- require 'rubygems'
- require 'bundler/setup'
- Bundler.require(:default,:development)
- ENV['RACK_ENV'] ||= 'test'
- require 'rack/test'
- require File.expand_path('../../config/environment',__FILE__)
- RSpec.configure do |config|
- config.mock_with :rspec
- config.expect_with :rspec
- config.raise_errors_for_deprecations!
- config.include FactoryGirl::@R_301_156@::Methods
- end
- require 'capybara/rspec'
- Capybara.configure do |config|
- config.app = Test::App.new
- config.server_port = 9293
- end
现在我的测试’users_spec.rb’看起来像:
- require 'spec_helper'
- describe App::UsersController do
- include Rack::Test::Methods
- def app
- App::API
- end
- describe "/users/me" do
- context "with invalid access token" do
- before(:each) do
- get "/api/v2/users/me"
- user = build(:user)
- end
- it 'returns 401 error code' do
- expect(last_response.status).to eq(401)
- expect(user).to eq(nil)
- end
- end
- end
- end
现在,当我尝试使用rspec spec / api / users_spec.rb运行测试时,我得到:
我不断得到这个错误:
- Failure/Error: user = build(:user)
- ArgumentError:
- Factory not registered: user
任何帮助将不胜感激,因为我一直在努力为此.
解决方法
问题在于,您可能不会将spec文件夹(以及工厂)暴露在加载路径中.一般来说,这是正确的事情.检查你* .gemspec,你可能有这样的东西:
- s.require_paths = ["lib"]
这意味着只有使用您的宝石的其他项目才能要求lib目录下的文件.见http://guides.rubygems.org/specification-reference/#require_paths=
所以为了解决你的问题,你需要把一个文件放在lib文件夹里,这个文件夹被称为你所在的工厂,需要这些文件.所以在你的情况下,创建一个文件lib /<你的gem名称> /factories.rb并添加:
- GEM_ROOT = File.dirname(File.dirname(File.dirname(__FILE__)))
- Dir[File.join(GEM_ROOT,'spec','factories','*.rb')].each { |file| require(file) }
在另一个项目中,加载工厂:
需要’<你的宝石名称> /工厂’
对我来说很好.我唯一没有想到的是如何命名你的工厂.不知道工厂女孩是否允许这个.