この .feature ファイルをビルドすると、テスト用の分離コードが作成されます。次に、各ステップをメソッドに接続する必要があります。これを行う最も簡単な方法は、
1: テストをデバッグします。テストは不確定として失敗します。Test run results specflow を見ると、このテストのテンプレートを追加するのに役立ちます。エラーメッセージは次のようになります
Assert.Inconclusive が失敗しました。1 つ以上のステップに一致するステップ定義が見つかりません。
[Binding]
public class StepDefinition1
{
[Given(@"a user signs up for a 30 day account")]
public void GivenAUserSignsUpForA30DayAccount()
{
}
[When(@"they login in 29 days")]
public void WhenTheyLoginIn29Days()
{
ScenarioContext.Current.Pending();
}
[Then(@"they will be let in")]
public void ThenTheyWillBeLetIn()
{
ScenarioContext.Current.Pending();
}
}
2: これを新しい specflow ステップ定義ファイルにコピーします。これは基本的に、specflow 属性が入力された単体テスト クラスです。今、あなたを助けるためにあなたができるいくつかのトリックがあります. GivenAUserSignsUpForA30DayAccount メソッドでは、30 日間の試用アカウントを持つテストで使用されるユーザーを作成します。プライベート メンバーはここでは正常に機能するため、メソッド間でアクセスできますが、これはすべてのメソッドが同じクラスにある場合にのみ機能します。複数の機能/クラス間でメソッドを再利用しようとする場合は、オブジェクトを ScenarioContext に保存することを検討する必要があります
3: specflow テストを実行すると、同じ文字列を持つ一致する属性を持つメソッドが検索されます。ここでの秘訣は、メソッド属性でワイルドカードを使用してパラメーターをメソッドに渡すことができることです。2種類のファイルカードがあります
(.*) は、そのメソッドに文字列を渡すことを意味します (\d+) は、そのメソッドに int を渡すことを意味します。
When メソッドは一般的であるため、このようなパラメーターを使用して再利用できます。
[When(@"they login in (\d+) days")]
public void WhenTheyLoginInDays(int daysRemaining)
{
Account.DaysRemaining = daysRemaining;
}
4: 最後に Assert を Then メソッドに追加して、最終結果が次のようになるようにします。(個人的には、機能の文言を少し再構成し、テスト ロジックが私の例ほど厄介ではない方法で期待される結果を渡すことに注意してください。データ ドリブン テストのシナリオの概要を参照してください)
[Binding]
public class StepDefinition1
{
UserAccount user;
[Given(@"a user signs up for a 30 day account")]
public void GivenAUserSignsUpForA30DayAccount()
{
user = AccountController.CreateNewUser("bob", "password", AccountType.Trial);
}
[When(@"they login in (\d+) days")]
public void WhenTheyLoginInDays(int daysRemaining)
{
Account.DaysRemaining = daysRemaining;
}
[Then(@"they will (.*)")]
public void ThenTheyWillBeLetIn(string expected)
{
//check to see which test we are doing and then assert to see the expected result.
if(string.Compare(expected, "be let in", true)
Assert.AreEqual(LoginResult.Passed, LoginService.Login);
if(string.Compare(expected, "be asked to renew", true)
Assert.AreEqual(LoginResult.Passed, LoginService.Login);
}
}