本日は、2009年のRuby Hero Awardの受賞者の1人であるRubyの信者であり、有名な開発者であるPat Allanによる投稿の翻訳をご紹介します。 この報酬は何ですか? 昨年の受賞者は、有意義な学習コンテンツの作成、プラグインと宝石の開発、オープンソースプロジェクトへの参加など、最も実績のあるコミュニティメンバーに授与されます。 この賞は、最も自明な人々を称賛し、彼らにふさわしいという認識を与えるために創設されました。
今年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でもう少し詳しく説明されてい
ます 。
すべて、テストの作成を開始します! 以下に小さな例を示します。
または、統合テストに
Capybara
を使用する:
キーを回す
そうです、ここに私のお気に入りのヘルパーの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の作業を終えた後、彼らは同じ機能を実行する
Kaminariのテストシェルを示しました(別のライブラリに入れられなかっただけです)。 他の誰かが同じことをしても驚くことはありませんが、似たようなものを探していると、テストまたは仕様ディレクトリ内のレールに完全なアプリケーションが付属している有名なライブラリにつまずきました。
Combustionがエンジンを装飾できると思われる場合は、試してみてください。バグを見つけて、gemがより広範なタスクで機能するという自信を付けてください。 パッチとレビューは明確に歓迎されます。