2011-01-24 25 views
8

Devise Gem'e bağlı bir Rails motoru geliştiriyorum. Motorumun kendisi de bir mücevher ve bu şey için testler yazmam gerekiyor. Bunun için ben bir mücevher içeriden bir motoru test etmek nasıl okumaları çok yaptım ve ben şu kurulum için geldi: i Devise mücevher dahil ÖnceDevils ve rspec ile Rails3 Motorunu test etme

my_engine 
+- app # my engine stuff 
+- config # my engine stuff 
+- Gemfile 
+- lib # my engine stuff 
+- publiC# my engine stuff 
+- spec 
    +- controllers # controller tests 
    +- models   # model tests 
    +- dummy   # a dummy application that is using the 'my_engine/Gemfile' 
    +- spec_helper.rb # the spec helper that boots the dummy app 

i testleri yazmak ve

onları çalıştırabilir
rake spec 

Şimdi ben devise mücevher ve bu

class Manager::User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, # ... 
end 

gibi bir kullanıcı modeli ve benim testler kullanıcı sınıfı ve vasiyetle çağrısına işaret başarısız.

`method_missing': undefined method `devise' 

Şimdi ben hatayı araştırmak ve birlikte vasiyetle ve benim motoru ile kukla uygulamayı nasıl açılacağına bulmaya çalış. Spec yardımcı evnironment.rb

# my_engine/spec/dummy/config/environment.rb 
# Load the rails application 
require File.expand_path('../application', __FILE__) 

# Initialize the rails application 
Dummy::Application.initialize! 

bu

# my_engine/spec/spec_helper.rb# 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../dummy/config/environment.rb", __FILE__) # boots the dummy app and fails 
# more rspec stuff gies here 

gibi application.rb

# my_engine/spec/dummy/config/application.rb 
require File.expand_path('../boot', __FILE__) 
require 'rails/all' 
Bundler.require(:default, Rails.env) if defined?(Bundler) 
# Dummy::Application definition follows here (the common stuff) 

boot.rb

# my_engine/spec/dummy/config/boot.rb 
require 'rubygems' 
# Loads the gemfile from 'my_engine/Gemfile' 
gemfile = File.expand_path('../../../../Gemfile', __FILE__) 

begin 
    ENV['BUNDLE_GEMFILE'] = gemfile 
    require 'bundler' 
    Bundler.setup 
rescue Bundler::GemNotFound => e 
    STDERR.puts e.message 
    STDERR.puts "Try running `bundle install`." 
    exit! 
end if File.exist?(gemfile) 

gemfile görünüyor

# my_engine/Gemfile 
source :gemcutter 

gem 'rails', '3.0.3' 
gem 'rake' 

gem 'devise', '>=1.2.rc' 
gem 'declarative_authorization', '0.5.2' 

group :test do 
    gem "cucumber" 
    gem "cucumber-rails" 
    gem "database_cleaner" 
    gem "capybara", ">= 0.4.0" 
    gem "capybara-envjs" 
    gem "culerity" 
    gem "webrat" 
    gem "rspec-rails", ">= 2.4.0" 
    gem "jeweler" 
end 
Ben Gemfile ve taşlar tam olarak yüklendiği bu

gem "my_engine", :path => "./" 

gibi benim motoru gerektirecek da çalıştı (Bundler.setup geçiyor ve sürekli kullanılabilir Vasiyetle).
Şimdi, my_engine gem kullanan harici bir uygulama oluşturdum. Testleri motorumdan kopyalayıp çalıştırdığımda, hepsi geçiyor.

Eksik olduğum bir şey var mı? Belki bir motor için test yapmak için daha iyi bir yol var mı?

cevap

3

Ne kadar acımasız bir utanç, başlangıç ​​başlatıcısını kukla uygulamaya eklemeyi unuttum. Her nasılsa benim dış uygulama için bunu düşündüm. Başlatıcı ile her şey mükemmel çalışıyor.

+0

İyi :) Mücevherlerim için bir rehber olarak kullanacağım :) – m4risU

+0

Ben gemfile = File.expand_path ('yorumlayarak, motorun gemspecinden ayrı olan uygulamanın kendisi için bir Gemfile ayarlama yaklaşımı alıyorum ../../../../Gemfile ', __FILE __) 've dinlenme ve yeni oluşturulan bir uygulamanın tipik içeriği ile yerine koyma. –