2011-05-14 5 views
7

Voici mon config.ruconcombre Configuration, Capybara et RSpec avec une application modulaire Sinatra

$:.unshift File.join(File.expand_path(File.dirname(__FILE__)), 'config') 
require 'boot' 

Routes = Rack::Mount::RouteSet.new do |set| 
    set.add_route App::Users, { :path_info => %r{^/users*} }, {}, :users 
    set.add_route App::Dashboard, { :path_info => %r{^/$} }, {}, :dashboard 
    set.add_route Rack::File.new(File.dirname(__FILE__) + "/public"), { :path_info => %r{^/*} }, {}, :public 
end 

run Routes 

boot.rb

require 'bundler' 
Bundler.setup 
Bundler.require(:default) 
Mongoid.load!(File.join(File.dirname(__FILE__), '/mongoid.yml')) 
%w(sinatra json yaml rack/mount rack/contrib).each {|l| require l } 
Dir["./lib/**/*.rb"].each { |f| require f } 

Et mon lib contient les applications et les modèles.

Comment laisser Concombre voir ma demande:

est ici concombre env.rb

require 'capybara' 
require 'capybara/cucumber' 
require 'rspec' 

World do 
    Capybara.app = App 
    include Capybara 
    include RSpec::Expectations 
    include RSpec::Matchers 
end 

Ce que je veux est de laisser env.rb lire mon config.ru et obtenir mon concombre prêt à être testé.

Répondre

4

définir votre env.rb:

ENV['RACK_ENV'] = 'test' 
require File.join(File.dirname(__FILE__), '..', '..', 'config/boot.rb') 

require 'capybara' 
require 'capybara/cucumber' 
require 'rspec' 

Capybara.app = eval("Rack::Builder.new {(" + File.read(File.dirname(__FILE__) + '/../../config.ru') + "\n)}") 

class SomeWorld 
    include Capybara 
    include RSpec::Expectations 
    include RSpec::Matchers 
end 

World do 
    SomeWorld.new 
end 

Et ça va marcher!

12

Dans @ la solution de amrnt vous pouvez remplacer cette ligne

Capybara.app = eval("Rack::Builder.new {(" + File.read(File.dirname(__FILE__) + '/../../config.ru') + "\n)}") 

avec ceci:

Capybara.app, _ = Rack::Builder.parse_file(File.expand_path('../../config.ru', __FILE__)) 

ou

Capybara.app = Rack::Builder.parse_file(File.expand_path('../../config.ru', __FILE__)).first  
+2

'rack :: Builder.parse_file' - exactement ce que je à la recherche de! – awendt

+0

Merci, mes tests Capybara ont fonctionné après avoir refactorisé mon application en contrôleurs modulaires. Question: Pourquoi 'Capybara.app, _ = Rack :: ....' fonctionne et 'Capybara.app = Rack :: ....' ne fonctionne pas? Que fait le ', _'? – Andy

+0

La taille des commentaires est très limitée ... donc, dans Ruby, et dans d'autres langues, la convention est d'utiliser '_' quand quelque chose vous est retourné, que vous n'avez pas besoin d'assigner. Par exemple: 'def foo; "barre", "baz"; fin ». Toutes mes excuses pour la mise en évidence de la syntaxe sans bloc. Si vous n'avez pas besoin de "baz", utilisez 'qux, _ = foo'. Si vous avez besoin des deux, faites 'qux, quz = foo' comme d'habitude. C'est la même chose ici. ['.parse_file' renvoie deux objets] (https://github.com/rack/rack/blob/master/lib/rack/builder.rb#L45) donc si vous n'avez pas besoin du second objet, vous le feriez utilisez '_'. Cela arrive aussi souvent avec les arguments de bloc. – jamesconant

Questions connexes