私は現在、APIの一部としてJSONテンプレートを出力するSinatraアプリを構築しています。railsとrspec-railsgemでテストしたとき、私は次のように呼び出すことができました。
response.should render_template('template-name')
ただし、Railsを使用していないため、これは機能しないと思います。json出力をテストするためにSinatraに使用する代替手段は何ですか?ありがとう!
私は現在、APIの一部としてJSONテンプレートを出力するSinatraアプリを構築しています。railsとrspec-railsgemでテストしたとき、私は次のように呼び出すことができました。
response.should render_template('template-name')
ただし、Railsを使用していないため、これは機能しないと思います。json出力をテストするためにSinatraに使用する代替手段は何ですか?ありがとう!
ここにRSpecでRackTestを使用するためのドキュメントがいくつかありますが、これが私の設定方法です。last_response.body
アプリをモジュールのクラスメソッドでラップすることで、仕様での実行がはるかに簡単になります。これは、(質問に対する簡単な回答です)を介して応答を検証する場合にすぎません。
# config.ru
require 'rubygems'
require "bundler/setup"
root = File.expand_path File.dirname(__FILE__)
require File.join( root , "./app/config.rb" )
# everything was moved into a separate module/file
# to make it easier to set up tests
map "/" do
run HelloWorld.app
end
# app/config.rb
require 'main'
module HelloWorld
def self.app
Rack::Builder.app do
# middleware setup here, cookies etc
run App
end
end
end
# app/main.rb
require 'sinatra/base'
module HelloWorld
class App < Sinatra::Base
get "/", :provides => :json do
{key: "value"}.to_json
end
end
end
# spec/spec_helper.rb
require 'rspec'
Spec_dir = File.expand_path( File.dirname __FILE__ )
require 'rack/test'
Dir[ File.join( Spec_dir, "/support/**/*.rb")].each do |f|
require f
end
# spec/support/shared/all_routes.rb
require 'hello_world' # <-- your sinatra app
shared_context "All routes" do
include Rack::Test::Methods
let(:app){
HelloWorld.app
}
end
shared_examples_for "Any route" do
subject { last_response }
it { should be_ok }
end
# spec/hello_world_spec.rb
require 'spec_helper'
describe 'getting some JSON' do
include_context "All pages"
let(:expected) {
'{"key": "value"}'
}
before do
get '/', {}, {"HTTP_ACCEPT" => "application/json" }
end
it_should_behave_like "Any route"
subject { last_response.body }
it { should == expected }
end