Преобразование в модульное приложение sinatra прерывает тесты - PullRequest
1 голос
/ 02 декабря 2011

Я выполнил модульную работу с классическим приложением sinatra и переместил свои маршруты в моем приложении sinatra в отдельные файлы маршрутов согласно https://stackoverflow.com/a/5030173/111884,, однако я не могу заставить мои тесты работать.

Вот как выглядят мои файлы:

. / Web.rb

require 'sinatra'
require 'sinatra/flash'

class MyApp < Sinatra::Application
  # ...
end

require_relative 'models/init'
require_relative 'helpers/init'
require_relative 'routes/init'

. / Маршруты / init.rb

require_relative 'main'

. / Маршруты / 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

Результаты тестов:

<h1>Not Found</h1>

Кажется, он не загружает файлы ./routes/*.rb.

Я использую Sinatra::Application вместо Sinatra::Base, но https://stackoverflow.com/a/5030173/111884 использует его.Здесь также упоминается http://www.sinatrarb.com/extensions.html. Я пытался изменить его на использование Sinatra::Base, но это не помогло.

Я также пробовал Синатра проверяет всегда 404 ' и Использование огурца с модульными приложениями Sinatra , но они не работают.

1 Ответ

6 голосов
/ 09 декабря 2011

Я думаю, вам просто нужно изменить метод app, чтобы он возвращал ваш модульный класс приложения (MyApp), а не класс Sinatra :: Base.Поэтому замените:

def app() Sinatra::Base end

в web_spec.rb на:

def app
  MyApp
end

Rack :: Test :: Methods зависит от метода приложения, чтобы сказатькласс для вызова для обработки запросов.В простом немодульном приложении Sinatra этим классом является Sinatra :: Base, потому что это класс, в котором маршруты применяются по умолчанию.В модульном приложении это класс, в котором вы определяете свои маршруты (MyApp в вашем случае).

...