私の「あはは!」RubyとRailsでのテストについての瞬間は、私が実際に座って主題に関する決定的なリソースであるRspecとCucumberの本を読んだときでした。キュウリに対する最初の軽sharedを分かち合いましたが、その時、私は写真をかなり間違った角度から見ていることに気付きました。
基本的に、CucumberはBDD(ビヘイビアドリブン開発)に関するものです。Cucumberを使用して機能、次の作業を計画します。うーん、次に、ユーザーがフォーラムまたは何かに投稿を宣伝できるようにしたい(例を盗むために;))それで、あなたは簡単な何かを書きます。
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
そこに関連するコードへの参照はほとんどないことに注意してください。それはあなたのステップにあります。コードをリファクタリングする場合、ステップ定義を変更する必要があるかもしれませんが、動作(機能)を変更する必要はありません。
これで、Cucumberの機能を実行するたびに、TDD(テスト駆動開発)を使用して機能をテストする方法がほとんど案内されます。これは、RSpecを使用して下位レベルで行われます。
最初の実行-最初のステップ定義は未定義です。ブロックをコピーして、たとえばuser_steps.rbまたはsession_steps.rbで定義します。これは、ユーザーとそのセッションに関連しているためです。次に、ユーザーがログインしていることをどのように定義しますか?ログインプロセスを介してそれらを取ることができます。
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
すべての幸せになるはずです。第二段階。
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
繰り返しますが、とても簡単です。ログインプロセスを完全にやり直す場合、または投稿の定義と表示方法を完全にやり直す場合は、動作を変更する必要はありません。第三のステップ。
When /^I vote the post up$/ do
pending
end
ここから新しい機能について説明し始めますが、どのように機能するかはまだよくわかりません。どうやって投稿に投票しますか?+1または何かの画像をクリックすると、コントローラーへのajaxポストが行われたり、JSONなどが返されたりします。これで、純粋なRspecテストに移行できます。
- ビューをテストして、+ 1画像が表示されることを確認します。
- 適切な形式の特定のajaxリクエストを受信したときにコントローラーが正しく動作することをテストします(幸福と不幸の両方のパス-無効な投稿IDが受信された場合はどうなりますか?投票数を正しく増やしますか?)
- 適切な形式のJSONのblobが与えられたときにJavaScriptが正しく応答することをテストします(使用されていることを示すために+1画像を更新しますか?(ここでGoogle+について考えます...)ありがとうメッセージを示しますか? )
これらはすべて動作に影響しませんが、下位レベルのテストの処理が終了したら、投稿の投票方法のステップ定義を記入するのは簡単です。それはのように簡単かもしれませんclick_link '+1'
。そして、残りの手順はテスト結果であり、これも簡単に実行できるはずです。そして、完了したら、機能が完全で終了していることがわかります。必要な動作が変更された場合は、機能を微調整できます。それ以外の場合は、完全に安全に実装コードを微調整できます。
これが理にかなっていることを願っています。それはすべて私の頭の外にありましたが、BDDとTDDの違い、そしてCucumberとRSpecが異なるニーズに応える理由を示していると思います。