2011-02-07 110 views
6

我开始在SpecFlow的世界,我遇到了我的第一个问题。 在保持我的代码干的方面,我想做到以下几点:默认值Specflow步骤定义

有两种情况:

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支持的默认参数值的想法,或实际上另一种方式来实现相同的效果。

非常感谢

回答

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 PARAM,其余由SpecFlow做...

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

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

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
}

+0

看到更多的例子我喜欢这个主意,以增加自己的日期表达式放在常见方案(今天,明天,下个月等) – 2011-02-07 15:53:28

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?在上面定义的场景中工作。

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来说可能没有帮助。不支持

+0

为什么“GivenTheProductIsDueToday(字符串日期业务方面的事情)“的日期已过在所有? – 2011-05-10 09:32:19

+0

糟糕!没有理由,除了我的人为错误。 – Lunivore 2011-05-10 14:02:15