好的。我想用RSpec为我的Sinatra应用程序做请求规范。
我有一个config.ru
# config.ru
require File.dirname(__FILE__) + '/config/boot.rb'
map 'this_route' do
run ThisApp
end
map 'that_route' do
run ThatApp
end
boot.rb只使用Bundler并对应用程序的其余部分做了额外的要求:
ThisApp看起来像:
# lib/this_app.rb
class ThisApp < Sinatra::Base
get '/hello' do
'hello'
end
end
所以我正在使用RSpec,我想编写请求规范,如:
# spec/requests/this_spec.rb
require_relative '../spec_helper'
describe "This" do
describe "GET /this_route/hello" do
it "should reach a page" do
get "/hello"
last_response.status.should be(200)
end
end
it "should reach a page that says hello" do
get "/hello"
last_response.body.should have_content('hello')
end
end
end
end
这很好用,因为我的spec_helper.rb设置如下:
# spec/spec_helper.rb
ENV['RACK_ENV'] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/boot")
require 'capybara/rspec'
RSpec.configure do |config|
config.include Rack::Test::Methods
end
def app
ThisApp
end
但我的问题是我想从我的rackup文件中测试“ThatApp”以及我可能稍后添加的任何更多应用程序以及“ThisApp”。例如,如果我有第二个请求spec文件:
# spec/requests/that_spec.rb
require_relative '../spec_helper'
describe "That" do
describe "GET /that_route/hello" do
it "should reach a page" do
get "/hello"
last_response.status.should be(200)
end
end
it "should reach a page that says hello" do
get "/hello"
last_response.body.should have_content('hello')
end
end
end
end
RackTest要求我正在测试的机架应用程序使用'app'方法在spec_helper文件中定义,我认为最终我将不得不在进一步请求规范时同样为Capybara.app提供相同的内容用它。
我觉得我错过了一些东西,也许有一种简单的方法可以在运行时为RackTest和Capybara设置'app',具体取决于我在我的请求规范中测试的路由和随后的机架应用程序。就像RSpec.configure中的before过滤器一样,但是我想不出或者找不到我如何访问当前加载的机架应用程序并尝试在测试套件运行之前将其设置在那里。
任何人都能得到我想要做的事情,能想到什么吗?谢谢你的帮助。
答案 0 :(得分:1)
为要测试的每个sinatra应用程序定义一个不同的帮助器模块,每个应用程序都应定义自己的app
方法,该方法返回相应的应用程序。然后,您可以在要测试给定应用的相应示例组中include MySinatraAppHelper
。
您还可以使用rspec metadata自动将模块包含在示例组中。
答案 1 :(得分:0)
看看我的sinatra-rspec-bundler-template。特别是在spec文件中。我认为这就是你想要实现的目标。
它结合了两个独立的Sinatra应用程序,每个应用程序都有自己的规格。