默认值Specflow Step Definitions

时间:2011-02-07 14:42:32

标签: .net testing bdd specflow

我是从SpecFlow开始的,我遇到了第一个问题。 在保持我的代码DRY方面,我想做以下事情:

有两种情况:

Given I am on a product page
And myfield equals todays date
Then...

Given I am on a product page
And myfield equals todays date plus 4 days
Then...

我希望使用以下步骤定义来涵盖我的And子句的两个变体:

[Given(@"myfield equals todays date(?: (plus|minus) (\d+) days)?")]
public void MyfieldEqualsTodaysDate(string direction, int? days)
{
//do stuff
}

然而,当SpecFlow试图解析int时,我一直得到异常? PARAM。 我检查了正则表达式,它肯定会按预期解析方案。 我知道我可以像方法重载一样粗暴等等,我只是想知道SpecFlow是否支持默认参数值的想法,或者确实是另一种方法来实现相同的效果。

非常感谢

4 个答案:

答案 0 :(得分:8)

(现在)不支持默认值,但对于具体情况,我可以建议以下内容:

SpecFlow支持创建“步骤参数转换”。使用它们,您可以创建可以从不同模式解析日期时间的方法:

[StepArgumentTransformation("todays date")]
public DateTime TransformToday()
{
  return DateTime.Today;
}
[StepArgumentTransformation("todays date (plus|minus) (\d+) days")]
public DateTime TransformOtherDay(string direction, int days)
{
  //...
}

之后,您只需在步骤中使用DateTime参数,其余部分由SpecFlow完成......

[Given(@"myfield equals (.*)")]
public void MyfieldEqualsTodaysDate(DateTime date)
{
  //do stuff
}

您可以在https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions

看到更多示例

答案 1 :(得分:2)

我的一位朋友使用以下技术

Given I am on a product page And myfield equals {TODAY}

Given I am on a product page And myfield equals {TODAY+4}

然后,您可以在步骤defs

中解析特殊短语

[Given(@"myfield equals ("SOME MATCHING REGEX")]
public void MyfieldEqualsTodaysDate(string date) {
//parse TODAY or you could use TOMORROW you get the idea
}

答案 2 :(得分:2)

您的步骤似乎以相当开发人员为中心的语言表达。

如果用相应的利益相关者语言表达,会发生什么?

Given I am on the product page
And my product is due for delivery today

Given I am on the product page
And my product is due for delivery in 4 days

Given I am on the product page
And my product was due for delivery 3 days ago

现在您可以使用正则表达式来匹配这些不同的步骤,并删除较低级别的复制。

[Given(@"my product is due for delivery today")]
public void GivenTheProductIsDueToday() {
    var dueDate = Date.Today;
    DoOtherStuffWith(dueDate);
}

[Given(@"my product is due for delivery in (.*) days")]
public void GivenTheProductIsDueIn(int days) {
    var dueDate = Date.Today.AddDays(days);
    DoOtherStuffWith(dueDate);
}

[Given(@"my product was due for delivery (.*) days ago")]
public void GivenTheProductWasDue(int days) {
    var dueDate = Date.Today.AddDays(-1*days);
    DoOtherStuffWith(dueDate);
}

我还没有使用SpecFlow,但我希望这是有道理的。 BDD的重点更多是关于实现业务和利益相关者之间的对话,而不是测试或自动化。从长远来看,对DRY的妥协可能没有帮助。

答案 3 :(得分:0)

到目前为止,我设法提出的最好成绩如下:
[Given(@"myfield equals todays date(?: ([\+-]\d+) days)?")]
public void MyfieldEqualsTodaysDate(string days)
{
int modifer = 0;
if(!String.IsNullOrEmpty(days))
{
modifer = Int32.Parse(days)
}
}

哪个比我原来的提案更清晰,但仍然需要我手动检查参数。请注意方法中的字符串参数。 Int还是Int?在上面定义的场景中工作。