Conversion à des tests modulaires breaks app sinatra
Question
J'ai modularisé par application classique et sinatra déplacé mes itinéraires dans mon application sinatra dans des fichiers individuels itinéraires comme par https: // stackoverflow .com / a / 5030173/111884 , cependant, je ne peux pas sembler obtenir mes tests de travail.
Voici ce que mes fichiers ressemblent à:
./ web.rb
require 'sinatra'
require 'sinatra/flash'
class MyApp < Sinatra::Application
# ...
end
require_relative 'models/init'
require_relative 'helpers/init'
require_relative 'routes/init'
./ routes / init.rb
require_relative 'main'
./ routes / main.rb
# The main routes for the core of the app
class MyApp < Sinatra::Application
get '/' do
erb :main
end
end
./ spec / spec_helper.rb
ENV['RACK_ENV'] = 'test'
require 'minitest/autorun'
require 'rack/test'
require 'factory_girl'
# Include factories.rb file
begin
require_relative '../test/factories.rb'
rescue NameError
require File.expand_path('../test/factories.rb', __FILE__)
end
# Include web.rb file
begin
require_relative '../web'
rescue NameError
require File.expand_path('../web', __FILE__)
end
./ spec / web_spec.rb
begin
require_relative 'spec_helper'
rescue NameError
require File.expand_path('spec_helper', __FILE__)
end
include Rack::Test::Methods
def app() Sinatra::Base end
describe "Some test" do
# ...
end
Rakefile
# Test rake tasks
require 'rake/testtask'
Rake::TestTask.new do |t|
t.libs << "test"
t.libs << "spec"
t.test_files = FileList['test/factories.rb', 'test/test_*.rb', 'spec/spec_helper.rb', 'spec/**/*_spec.rb']
t.verbose = true
end
La sortie des tests est:
<h1>Not Found</h1>
Il ne semble pas charger les fichiers ./routes/*.rb
.
J'utilise Sinatra::Application
, au lieu de Sinatra::Base
, mais https://stackoverflow.com/a/5030173/111884 utilise. Il a également des références ici http://www.sinatrarb.com/extensions.html . Je l'ai essayé de changer à utiliser Sinatra::Base
, mais il n'a pas le réparer.
J'ai aussi essayé teste toujours Sinatra 404'ing et Using concombre avec Sinatra Apps modulaire , mais ils ne fonctionnent pas.
La solution
Je pense que vous avez juste besoin de changer votre méthode de app
pour retourner votre classe d'application modularisé (MyApp) plutôt que la classe Sinatra :: Base. Donc remplacer:
def app() Sinatra::Base end
web_spec.rb, avec:
def app
MyApp
end
rack :: Test :: Méthodes dépend la méthode d'application pour lui dire quelle classe d'appeler à des demandes de traitement. Dans une application simple Sinatra non modulaire classe est Sinatra :: Base parce que c'est la classe où les routes sont appliquées par défaut. Dans une application modulaire qui est la classe dans laquelle vous définissez vos itinéraires (MyApp dans votre cas).