2010-11-28 12 views
1

ユーザーが自分のアバターをアップロードできるアプリケーションがあるとし、作物ページにリダイレクトされるとします。私は、アップロードキュウリの最初のシナリオを直接実行する方法

Scenario: Registered user wants to upload avatar 
    Given I follow "Upload picture" 
    When I attach the file "spec/fixtures/kitten.jpg" to "user_avatar" 
    And I press "Upload" 
    Then I should see "Picture was successfuly uploaded." 
    And I should be on the user crop page 

のためにこのようなキュウリのシナリオを持っているかもしれませんし、私は直接、最初のものをたどるアバターを、トリミングのためのシナリオを作成します。それは私が私に巨大な重複のように見える前のシナリオ、とまったく同じことを行うために

Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar 

を定義する必要がしかし、ここ

Scenario: User just uploaded avatar 
    Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar 
    When I crop it to 100x100 px 
    And I press "Crop" 
    Then my avatar should have 100x100 px 
    And I should see "Picture successfuly cropped." 

次のようになります。言うまでもなく、この後すぐに3番目のシナリオを続行したい場合は、2番目のシナリオを複製する必要があります。

小さな例では、このすべてを1つの大きなシナリオに入れることができますが、この場合でも非常に醜いように見えます。

いくつかのシナリオが互いに続く、次のいずれかに自分の状態を渡すようにする一般的には正しい戦略とは何ですか?

答えて

3

一般では、お互いのテストを条件付きにする必要はありません。彼らは、独立して、任意の順序で実行することができるはずです。あなたのテストを一緒に結合し始める時点で、失敗をより難しくするようになるでしょう。

私のアバターが最初cukeの正確な複製である必要はありませんされて、私はちょうど「スペック/備品/ kitten.jpg」をアップロード考えます。キュウリのステップで、ファイルシステム上のファイルと必要なモデルを簡単に作成することができます。あなたはすでにアップロード部分が動作していることを知っていますので、2番目の例のトリミングの前にフルアップロードを行う必要はありません。

あるいは、あなたが含まれている単一のステップにすることができます:

Given I follow "Upload picture" 
When I attach the file "spec/fixtures/kitten.jpg" to "user_avatar" 
And I press "Upload" 

そして再使用スペックのものを。こうすることで、最初のテストではランディングページとフラッシュをテストし、2番目のテストではクロップをテストできます。 2回目のテストでは、フラッシュとランディングページの値は関係ありません。

0

この上の私の気持ちは、あなたが自己完結あなたのすべてのテストを行うことを目指し、また、ベースのタスクではなく、活動ベースのアプローチを目指すべきであるということです。私はこのような何かを提唱します:

(注:私はここにグルーヴィー使用している私はルビーとその快適ではないだから)

Scenario: User just uploaded avatar 
Given I just uploaded "spec/fixtures/kitten.jpg" as my avatar 
When I crop it to 100x100 px 
And I press "Crop" 
Then my avatar should have 100x100 px 
And I should see "Picture successfuly cropped." 

ステップの定義を再利用することができますメソッドを呼び出す必要があります。

Given(~'I just uploaded "(.+)" as my avatar') { avatar -> 
    uploadAvatar(avatar) 
} 

def uploadAvatar(avatar) { 
    //place the previous steps in here. 
} 

は、あなたが私に前に何をしていたよりもはるかに簡単に思えます。

注:アクティビティvsタスクはこの例で説明できます。ATMをテストしているとします。アクティビティは「銀行への識別」、「引き出し」など... 「ATMへのアプローチ」、「ピンの入力」、「ピンの確認」、「金額の選択」、「OKを押す」などのタスクがあります。 。、

アクティビティでは、システムの動作をよりよく説明し、UIを開いたままにして、テストが脆弱でないことを意味します。

関連する問題