Specflowでは、手順/機能間でデータを共有するにはどうすればよいですか?
質問
common 'when' stepを使用しているが異なる 'then' Stepsを使用する2つの機能があります。
たとえば、MVCコントローラーの呼び出しからのアクションにアクセスするにはどうすればよいですか?
解決
Specflow 1.3には、3つの方法があります。
- 静的メンバー
- sinariocontext
- コンテキストインジェクション
コメント:
静的メンバーは非常に実用的であり、この場合、開発者として私たちが最初に考えるほど悪くはありません(ステップ定義でock笑/交換する必要はありません)
@siの回答はこのスレッドに留めておいてください
ステップ定義クラスのコンストラクターに引数が必要な場合、Specflowはこれらの引数を注入しようとします。これを使用して、同じコンテキストをいくつかのステップ定義に注入できます。
ここで例を参照してください:https://github.com/techtalk/specflow/wiki/context-injection
他のヒント
すべての手順に共通の辞書であるSaniaroContextクラスを使用します。
ScenarioContext.Current.Add("ActionResult", actionResult);
var actionResult = (ActionResult) ScenarioContext.Current["ActionResult"];
書くことができるヘルパークラスがあります
Current<Page>.Value = pageObject;
これはシナリオコンテキストのラッパーです。タイプ名から動作するので、同じタイプの2つの変数にアクセスする必要がある場合は、少し拡張する必要があります
public static class Current<T> where T : class
{
internal static T Value
{
get {
return ScenarioContext.Current.ContainsKey(typeof(T).FullName)
? ScenarioContext.Current[typeof(T).FullName] as T : null;
}
set { ScenarioContext.Current[typeof(T).FullName] = value; }
}
}
2019編集:私は最近 @Joetの答えを使用します、それはあなたが拡張機能を定義する必要なく同じ利点を得るようです
各辞書のエントリをキャストする必要があるため、シナリオを使用するのは好きではありませんでした。アイテムをキャストする必要なく、アイテムを保管して取得する別の方法を見つけました。ただし、ここでは、キーとしてタイプをシナリオコンテキストdictionaryからオブジェクトにアクセスするために効果的に使用しているため、トレードオフがあります。これは、そのタイプの1つのアイテムのみを保存できることを意味します。
TestPage testPageIn = new TestPage(_driver);
ScenarioContext.Current.Set<TestPage>(testPageIn);
var testPageOut = ScenarioContext.Current.Get<TestPage>();
保存している値の鍵である手順でパラメーターを定義できます。これにより、キーを使用して、後の手順で参照できます。
...
Then I remember the ticket number '<MyKey>'
....
When I type my ticket number '<MyKey>' into the search box
Then I should see my ticket number '<MyKey>' in the results
実際の値を辞書やプロパティバッグなどに保存できます。