我是从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是否支持默认参数值的想法,或者确实是另一种方法来实现相同的效果。
非常感谢
答案 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?在上面定义的场景中工作。