2

ページ オブジェクトで Specflow を使用していますが、非常によく似たシナリオがたくさんあります。例えば:

Given I view the 'page1'  
When I click 'link1'  
Then I should be on 'page2'  

Given I view the 'page1'  
When I click 'link2'  
Then I should be on 'page3'

「クリックすると...」ステップを1ステップバインドする方法を確認するのに苦労しています。ページ オブジェクトのパターンに従う場合、「それなら...」ステップでナビゲートした特定のページ オブジェクトを常に返す必要があります。

現在のページ オブジェクトを格納するプロパティを含む基本ステップ定義クラスがあります。

 public class BaseStep : Steps
{
    protected RemoteWebDriver Driver {
        get
        {
            return ScenarioContext.Current.Get<RemoteWebDriver>();
        }
        set
        {
            ScenarioContext.Current.Set(value);
        }
    }

    protected BasePageObject CurrentPageObject
    {
        get
        {
            return ScenarioContext.Current.Get<BasePageObject>();
        }
        set
        {
            ScenarioContext.Current.Set(value);
        }
    }
}

シナリオごとに 1 つのステップ定義を記述したくはありません。これは、1 つのメソッドにまとめたい多くのコードを再利用するためです。では、どうすればステップ定義を再利用し、引き続きページ オブジェクト パターンを使用できるでしょうか?

ありがとう。

4

2 に答える 2

0

他の人の意見や慣習にもとても興味がありますが、ここに私の考えがあります。

一般的な「クリックすると'([^'] *)'」バインディングを使用する場合、現在のシナリオが何であるかについて、一般的な情報はあまりありません。それでも、次のページが読み込まれるのを「待つ」ことを試みることができ、(IWebDriver)URLをチェックして、現在の場所を把握することができます(ブラウザーによる)。現在のページオブジェクトを適切に選択できるようにするには、URLとページオブジェクト間のマッピングが必要になります。この目的のために手動でマッピングを構築するか、いくつかの規則を使用するか、ASP.NETルーティングやサイトマップなどの他の既存の「マッピング情報」を使用するか、これらを組み合わせて使用​​することができます。;)

もう1つの可能性は、現在のURLの評価をThenに延期することですが、この場合、おそらくCurrentPageObjectプロパティゲッターはこれをカプセル化する必要があります。つまり、プロパティの値は、特定のThenを「呼び出す」かどうかに依存するべきではないということです。

私は私の最後のプロジェクトの1つで少し異なるアプローチを試しました。シナリオに対してより具体的なWhenステートメントを記述したので、「「検索」をクリックしたとき」、「「注文」をクリックしたとき」、「「確認」をクリックしたとき」の代わりに、「パラメーターを使用して検索を実行したとき」がありました。 「記入」、「選択した商品を注文するとき」、「注文を確認するとき」。これらのステートメントは具体的なアクションを記述しているため、現在のページオブジェクト(問題の具体的なページにキャストされた)に委任しました。ここで、ページオブジェクトにはこれらのアクションの具体的なメソッドがあります。実装は、適切なボタン(基本機能)を「クリック」しただけでなく、ページのロードを待機し、現在のページオブジェクトを適切に設定しました。このような具体的なケースでは、「次の」現在のページオブジェクトが何であるかが明らかであるか、より多くの可能な結果があれば、何が起こったかを多かれ少なかれ簡単に確認できました。私が支払った代償は、それが単一の一般的なものではなかったということでした。クリックのステップ定義の場合、(上記で説明したもの以外の)利点は、シナリオの表現が具体的なUIコントロールではなく、ユーザーの意図に焦点を合わせていることでした。 -レベルの相互作用(アクションの実行と何かのクリック)

于 2011-08-28T21:22:40.783 に答える