转换为模块化sinatra应用程序中断测试

zlo*_*log 1 testing sinatra minitest

我已经通过经典的sinatra应用程序进行模块化,并根据/sf/answers/352112141/将我的sinatra应用程序中的路线移动到单独的路径文件中,但是,我似乎无法让我的测试工作.

这就是我的文件的样子:

./web.rb

require 'sinatra'
require 'sinatra/flash'

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

require_relative 'models/init'
require_relative 'helpers/init'
require_relative 'routes/init'
Run Code Online (Sandbox Code Playgroud)

./routes/init.rb

require_relative 'main'
Run Code Online (Sandbox Code Playgroud)

./routes/main.rb

# The main routes for the core of the app
class MyApp < Sinatra::Application
  get '/' do
    erb :main
  end
end
Run Code Online (Sandbox Code Playgroud)

./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
Run Code Online (Sandbox Code Playgroud)

./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
Run Code Online (Sandbox Code Playgroud)

Rake文件

# 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
Run Code Online (Sandbox Code Playgroud)

测试的输出是:

<h1>Not Found</h1>
Run Code Online (Sandbox Code Playgroud)

它似乎没有加载./routes/*.rb文件.

我正在使用Sinatra::Application,而不是Sinatra::Base,但/sf/answers/352112141/使用它.它还在http://www.sinatrarb.com/extensions.html中引用它.我试过更改它来使用Sinatra::Base,但它没有解决它.

我也尝试过Sinatra测试总是404'ing使用Cucumber与模块化Sinatra应用程序,但他们不工作.

Ste*_*eve 6

我认为你只需要改变你的app方法来返回你的模块化应用程序类(MyApp)而不是Sinatra :: Base类.所以替换:

def app() Sinatra::Base end
Run Code Online (Sandbox Code Playgroud)

在web_spec.rb中,用:

def app
  MyApp
end
Run Code Online (Sandbox Code Playgroud)

Rack :: Test ::方法取决于app方法告诉它调用哪个类来处理请求.在一个简单的非模块化Sinatra应用程序中,该类是Sinatra :: Base,因为这是默认应用路由的类.在模块化应用程序中,您可以在其中定义路径(在您的情况下为MyApp).