【问题标题】:Converting to modular sinatra app breaks tests转换为模块化 sinatra 应用程序会破坏测试
【发布时间】:2012-01-11 12:10:33
【问题描述】:

我已通过经典 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'

./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

瑞克文件

# 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,但没有解决。

我也尝试过Sinatra tests always 404'ingUsing Cucumber With Modular Sinatra Apps,但它们不起作用。

【问题讨论】:

  • 不是答案,而是注意......我尝试了完全相同的帖子 - 并将所有内容分开,然后全部取出 - 太复杂了。我已经切换到在一个主应用程序文件中创建所有路由 - 每个路由调用只有一两行,所有其他文件中都发生了繁重的工作。然后弄清楚路由发生了什么,将其全部放在一个文件中。这个文件没有我想象的那么大。路线比我想象的要少。我还练习尽可能多地使用类与模块,以保持事物的可重用性并减少无意的副作用。
  • 认为我会做同样的事情。这有点复杂,但我认为当应用程序增长时它是值得的。但是,运行测试比现在将代码分成文件更重要。

标签: testing sinatra minitest


【解决方案1】:

我认为您只需要更改 app 方法即可返回模块化应用程序类 (MyApp) 而不是 Sinatra::Base 类。所以替换:

def app() Sinatra::Base end

在 web_spec.rb 中,带有:

def app
  MyApp
end

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

【讨论】:

  • 哦,这太简单了!我很早就尝试过,但我认为它不起作用,因为我的测试还有其他问题。谢谢你让我再试一次!
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多