3

私は Sinatra に比較的慣れていないので、RSpec を私の Sinatra セットアップに統合する方法を見つけたいと思っています。

config.ru

require 'sinatra'
require 'mongoid'
require 'uri'
require './lib/twilio_wrapper'

Mongoid.load!("./config/mongoid.yml")

Dir["./controllers/*.rb"].each { |file| require file }

run Rack::URLMap.new(
  '/' => HomeController.new,
  '/users' => UsersController.new(TwilioWrapper.new)
)

この設定により、コントローラーをモジュール化し、ヘルパー クラス (TwilioWrapper など) の単一インスタンスを作成できます。ただし、RSpec をセットアップしたい場合は、アプリケーションのクラスを指定する必要があります。ただし、上記の状況では、Rack::URLMap を使用しているため、RSpec を指す特定のアプリケーション クラスがありません。

テスト用にRSpecを含めながら、上記の方法でコードをモジュール化するにはどうすればよいですか?

4

1 に答える 1

3

ラックはコントローラーを気にせず、アプリを気にします。それでHomeControllerUsersController2 つの Sinatra アプリケーションが Rack に「ラックアップ」されています。これらはコントローラーではなく、別個の Rack アプリです。2 つのアプリケーションが必要だとは思いませんが、これらの 2 つのコントローラーを 2 つのファイルに配置して、それらを個別に指定してコードを読みやすくすることができます。

シナトラの命名規則は、MyAppこれを反映するような名前にすることです。Sinatra はフラットなフレームワークですが、「コントローラー」ファイルには好きな名前を付けることができます。

したがって、フォルダーroutesには「users.rb」と「home.rb」を含めることができますが、両方のファイルが上部にあります

MyApp < Sinatra::Application

次にRack::Test、Rspec を使用してテストできます。

実際に 2 つのアプリをテストし、Rack::Testw Rspec を使用してプレフィックスが必要な場合appは、spec_helper または spec ファイルで次のように定義するだけです。

 def app
  run Rack::URLMap.new(
   '/' => HomeController.new,
   '/users' => UsersController.new(TwilioWrapper.new)
  )
 end

SinatraRack::Testアプリをテスト コンテナーにラックアップするだけです。

また、Sinatra アプリケーションのレイアウト方法に関する Phrogz の優れた回答もご覧ください。

于 2013-02-06T21:37:30.107 に答える