今年11月5〜6日にキエフで開催されるRubyCカンファレンスでPetとチャットできます 。
先月のかなりの部分を私の最初のRailsエンジンの作成に費やしましたが、それでも完了しませんでした。作業自体はクライアント向けであったため、詳細については説明できません。
開発プロセス中に、Railsエンジンをテストする方法が必要であることがすぐに明らかになりました。 最も単純な単体テストを考慮せずに、統合テストのかなり一般的な方法は、アプリケーションのコピーを
spec
または
test
ディレクトリ内のレールに保存することです。
このアプローチは私には困難で信頼性が低いように思えたので、他のことを試してみることにしました。
目標は、包括的なテストをシンプルでわかりやすい方法で整理することでした。テスト対象のRailsアプリケーションの隣のspecディレクトリにテストをパックするのではなく、自分のspecディレクトリ内にテストを記述します。 さらに、
Capybara DSL
使用すると
Capybara DSL
。
もちろん、実際のRailsアプリケーションが必要であり、それに基づいてテストを実行しますが、最終的には、railsによって生成されたアプリケーションのファイルのほとんどを削除できます。 実際、Railsが必要とするファイルは
config/database.yml
のみです-ActiveRecordを使用する必要がある場合のみ。
Combustionへようこそ。これは、標準的なRailsアプリケーションのすべてのデフォルトを備えた、最小限のエンジンテストアプリケーションライブラリです。
カスタマイズ可能
典型的なセットアップ/インストールは次のとおりです。
- gemを
Gemfile
追加します(そしてbundle
コマンドを実行します-約per。)。 - Railsアプリケーションのスタブを作成するために、Railsエンジンのディレクトリでジェネレーターを実行します。combust(またはgemファイルでgithリポジトリを使用する場合は
bundle exec combust
combust); -
Combustion.initialize!
追加しCombustion.initialize!
spec/spec_helper.rb
(これまでのところRSpec
のみがサポートされていますが、TestUnit
に必要であれば、パッチに問題はないはずです)。
Capybara
与えられた典型的な
spec_helper.rb
は次のとおりです。
require 'rubygems' require 'bundler' Bundler.require :default, :development require 'capybara/rspec' Combustion.initialize! require 'rspec/rails' require 'capybara/rails' RSpec.configure do |config| config.use_transactional_fixtures = true end
すべてを機能させる
まず、Railsアプリケーション内でRailsエンジンを使用していることを確認する必要があります。 ジェネレーターは必要なフックを追加する必要がありましたが、これはこのために必要なだけです。 ルートを追加する必要がある場合は、
spec/internal/config/routes.rb
ます。 モデルが必要な場合は、それらを
spec/internal/db/schema.rb
に追加して
spec/internal/db/schema.rb
。 すべてがREADMEでもう少し詳しく説明されています 。
すべて、テストの作成を開始します! 以下に小さな例を示します。
# spec/controllers/users_controller_spec.rb require 'spec_helper' describe UsersController do describe '#new' do it "runs successfully" do get :new response.should be_success end end end
または、統合テストに
Capybara
を使用する:
# spec/acceptance/visitors_can_sign_up_spec.rb require 'spec_helper' describe 'authentication process' do it 'allows a visitor to sign up' do visit '/' click_link 'Sign Up' fill_in 'Name', :with => 'Pat Allan' fill_in 'Email', :with => 'pat@no-spam-please.com' fill_in 'Password', :with => 'chunkybacon' click_button 'Sign Up' page.should have_content('Sign Out') end end
キーを回す
そうです、ここに私のお気に入りのヘルパーの1つがあります
config.ru
ジェネレーターは
config.ru
ファイルをエンジンに追加します。つまり、次のことを意味します。ブラウザーでテストアプリケーションを実行できます。
localhost:9292
localhost:9292
。
いくつかの予約
すでに述べたように、
Combustion
RSpec
用
Combustion
作成されましたが、
RSpec
パッチを喜んで受け入れます。 同じことが
Cucumber
にも当てはまり、理論上は動作するはずですが、私はテストしていません。
さらに、gemはRails 3.1用に作成されています-いくつかのパッチを適用した後、Rails 3.0で動作するはずですが、3.0までの何かで動作することを強く疑います。 ただし、自由に探索してください。
エンジンではないライブラリの統合テストにgemが役立つ可能性もあります。 これを確認したい場合は、プロセスがどのように進んでいるかをお尋ねします。
おわりに
さて、私たちがどこに連れて行かれたか見てみましょう。
- 最小限必要なRailsアプリケーションでエンジンをテストできます。
- Railsアプリケーションでは、テストに必要なものだけを追加します。
- テストコードはずっときれい(こんにちはDRY!)で、メンテナンスが簡単です。
- 標準のヘルパーを使用できます。 統合テスト用の
RSpec
およびCapybara
。 -
Rack
おかげで、テストアプリケーションをライブ表示できます。
Combustionがエンジンを装飾できると思われる場合は、試してみてください。バグを見つけて、gemがより広範なタスクで機能するという自信を付けてください。 パッチとレビューは明確に歓迎されます。