2015-07-29 30 views
13

Ho una gemma che include alcune fabbriche. La gemma simile a:Come posso condividere le fabbriche che ho in un GEM e usarlo in un altro progetto?

. 
├── 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 

ora sto usando la gemma in un altro progetto Rubino (uva) con l'aggiunta di qualcosa di simile a gem 'core', git: 'https://url.git'.

Ora tutto funziona correttamente, poiché è possibile utilizzare il modello User dal progetto Grape.

Tuttavia, desidero utilizzare le fabbriche (users) in modo da poter scrivere ulteriori test di integrazione per il progetto Grape.

Nel progetto di uva, in spec_helper.rb Assomiglia:

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 

Ora il mio test 'users_spec.rb' assomiglia:

require 'spec_helper' 

describe App::UsersController do 
    include Rack::Test::Methods 

    def app 
    App::API 
    end 

    describe "https://stackoverflow.com/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 

Ora, quando si tenta di eseguire il test utilizzando rspec spec/api/users_spec.rb I ottenere:

continuo a ricevere questo errore:

Failure/Error: user = build(:user) 
ArgumentError: 
    Factory not registered: user 

Qualsiasi aiuto sarebbe apprezzato visto che ho lottato per questo.

+2

Ahh! bello vedere alcune specifiche ,, :) –

+0

Anche se potrebbe essere possibile. È discutibile se dovresti condividere le specifiche. Dovresti usare solo ciò che la gemma fornisce. E le specifiche dovrebbero essere per la tua applicazione, quindi non dovresti aver bisogno delle fabbriche. –

risposta

10

Il problema è che probabilmente non esporre la cartella delle specifiche (e di seguito le fabbriche) nel percorso di caricamento. Che, in generale, è la cosa giusta da fare. Verificare di *.gemspec, probabilmente avete qualcosa di simile:

s.require_paths = ["lib"] 

Questo significa solo i file nella directory lib può essere richiesto da altri progetti che utilizzano il vostro gioiello. Vedi http://guides.rubygems.org/specification-reference/#require_paths=

Quindi, per risolvere il problema, è necessario inserire un file nella cartella lib che "conosce" il punto in cui si trovano le vostre fabbriche e le richiede. Così in voi caso, creare un file lib/<your gem name>/factories.rb e aggiungere:

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

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

Nell'altra Carica progetto fabbriche con:

require '<your gem name>/factories'

funziona bene per me. L'unica cosa che non ho ancora capito è come assegnare un nome ai tuoi stabilimenti. Non sono sicuro che la factory girl lo permetta.

+2

'Dir [File.join (GEM_ROOT, 'spec', 'factory', '**', '*. Rb')]. Each {| file | require (file)} 'Questo includerà anche le fabbriche in sottocartelle –