构建这个.feature文件将为测试创建一个代码后端。然后,您需要将每个步骤连接到一个方法。最简单的方法是:
1:调试测试,测试将失败并显示未决。查看测试运行结果specflow会通过为该测试添加一个模板来帮助您。错误消息将类似于:
Assert.Inconclusive失败。找不到一个或多个步骤的匹配步骤定义。
[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测试运行时,它会查找具有相同字符串的匹配属性的方法。这里的诀窍是,您可以使用方法属性中的通配符向方法传递参数。有两个不同的通配符:
(.*)表示您正在将一个字符串传递给该方法
(\d+)表示您正在将一个整数传递给该方法。
由于您的When方法是常见的,因此您可以像这样重用它的参数。
[When(@"they login in (\d+) days")]
public void WhenTheyLoginInDays(int daysRemaining)
{
Account.DaysRemaining = daysRemaining;
}
4: 最后将你的断言添加到Then方法中,使最终结果看起来像这样。(请注意,个人建议重新构造feature的措辞,并以期望结果的方式传递它,这样测试逻辑就不会像我的示例那样混乱。可以查看数据驱动测试的场景概述)
[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)
{
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);
}
}