Подтвердить что ты не робот

Как я могу разделить фабрики, которые у меня есть в GEM, и использовать их в другом проекте?

У меня есть драгоценный камень, который включает в себя некоторые Заводы. Драгоценный камень выглядит примерно так:

.
├── 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 'core', git: 'https://url.git'.

Теперь все работает нормально, поскольку я могу использовать модель User из проекта Grape.

Однако я хочу использовать фабрики (users), поэтому я могу написать дополнительные интеграционные тесты для проекта 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::Syntax::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

Любая помощь была бы оценена, поскольку я боролся за это.

4b9b3361

Ответ 1

Проблема заключается в том, что вы, вероятно, не открываете папку спецификаций (и при этом фабрики) в пути загрузки. Это, в общем, правильная вещь. Проверьте *.gemspec, у вас, вероятно, есть что-то вроде:

s.require_paths = ["lib"]

Это означает, что только файлы в каталоге lib могут потребоваться другими проектами, использующими ваш драгоценный камень. См. http://guides.rubygems.org/specification-reference/#require_paths=

Итак, чтобы решить вашу проблему, вам нужно поместить файл в папку lib, которая "известна", где находятся ваши заводы, и требует их. Поэтому в вашем случае создайте файл lib/<your gem name>/factories.rb и добавьте:

GEM_ROOT = File.dirname(File.dirname(File.dirname(__FILE__)))

Dir[File.join(GEM_ROOT, 'spec', 'factories', '*.rb')].each { |file| require(file) }

В другом проекте загрузите фабрики с помощью:

require '<your gem name>/factories'

Прекрасно работает для меня. Единственное, что я еще не понял, это то, как прописать ваши заводы. Не уверен, разрешает ли девушка factory.