RSpec が特定のモジュールの単体テストである場合、Cucumber はアプリケーション全体を外部からテストするものと考えてください。Cucumber でアプリケーションに持たせたい動作を指定することから始めて、RSpec にドロップダウンし、その動作を機能させるクラスとモジュールを記述します。
理解するのに少し時間がかかりましたが、Cucumber は、アプリケーションに実行させたい機能を大まかに説明するのに非常に優れており、RSpec は実際にそれをどのように行うべきかを説明するのに非常に優れていることがわかりました。
つまり、きゅうりのストーリーで、どのような機能が必要かを説明し、入力を提供して出力を確認するための非常に簡単な手順を記述します。次に、RSpec にドロップダウンし、実際にどのように実行するかについて仕様を記述します。
あなたの機能が、Web サイトでユーザー名を検索する機能であるとしましょう。次のようにキュウリの機能と最初の (そして最初だけの) シナリオを書くかもしれません:
Feature: Search users
In order to find people with similar interests as myself
As a user
I want to search for people
Scenario: Search for similar hobbies
Given there is a search page
And there is a list of hobbies
And one of the hobbies is "full contact ironing"
When I select "full contact ironing"
And press search
Then a list of users with the hobby "full contact ironing" are shown
Cucumber を実行すると、不足しているステップが表示されます。それらをコピーして、このようなものをチェックするための簡単なステップを作成しますが、まだコードを記述しません。
ステップの定義が完了したら、RSpec にドロップダウンして、これをどのように機能させたいかについての仕様を書き始めます。(キュウリはもちろん失敗するはずです)
describe "SearchController" do
it "should respond to searches" do
sc = SearchController.new
sc.should respond_to(:search)
end
end
RSpec を実行し、失敗するのを確認してから、コードを書きます。
class SearchController
def search
end
end
それでおしまい。ここで、テストを再度実行します。合格するはずなので、より具体的に始め、実際に検索機能をどのように使用するかを説明し始めます。あまり深く掘り下げたくはありませんでしたが、Cucumber で必要なものを記述し、それが RSpec で実際にどのように機能するかを記述するというアイデアを提供したかっただけです。
もちろん、Cucumber または RSpec ですべてを実行できますが、Cucumber を使用すると、必要なことを非常に簡単な方法で伝えることができることがわかりました。RSpec でそれを行おうとすると、詳細に行き詰まってしまいます。最初に Cucumber を使用して、必要な基本機能とその理由を説明した場合、RSpec に立ち寄って、その機能を実際にどのように機能させたいかを説明できます。
テストで重複が発生することがありますが、これはあまり DRY ではありませんが、詳細レベルの問題と考えれば、それほど気にならないかもしれません。最初は、Cucumber で欲しいものを一般的に言ってから、RSpec で欲しいものを具体的に言うべきだと気付くまで、多くの努力を繰り返していました。
これはすべて、ツールの使用方法に関する初心者のアイデアにすぎませんが、これまでのところうまく機能しているようです。私はおそらくあなたにひどい例を挙げましたが、ツールを使用するときに役立つとわかった一般的な詳細から特定の詳細まで要点を理解しようとしています.