Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 不明确的步骤定义_.net_Regex_Specflow - Fatal编程技术网

.net 不明确的步骤定义

.net 不明确的步骤定义,.net,regex,specflow,.net,Regex,Specflow,我有以下两个步骤的定义: [When(@"I Schedule a Start Now Event named ""(.*)"" for the DR program named ""(.*)""")] [When(@"I Schedule a Start Now Event named ""(.*)"" for the DR program named ""(.*)"" with load control device ""(.*)""")] 在场景中使用上述两个步骤定义时,我可以看到第二

我有以下两个步骤的定义:

[When(@"I Schedule a Start Now Event named ""(.*)"" for the DR program named ""(.*)""")]

[When(@"I Schedule a Start Now Event named ""(.*)"" for the DR program named ""(.*)"" with load control device ""(.*)""")]
在场景中使用上述两个步骤定义时,我可以看到第二个步骤定义无法绑定

这是因为,当我注释掉第二个步骤定义时,我的步骤对第一个步骤定义的出价如下:

当我为名为“~@=program”且负载控制设备为“Light”的DR程序安排名为“~@+Event”的立即启动事件时
带有负载控制装置“灯”的术语
“~@=程序”
假定为单字符串值。但不应该是这样

它应该与第二步定义绑定


这是一个正则表达式模式问题吗?

在我看来,您需要更具体一些:

[When(@"I Schedule a Start Now Event named ""([^""]*)"" for the DR program named ""([^""]*)""")]

[When(@"I Schedule a Start Now Event named ""([^""]*)"" for the DR program named ""([^""]*)"" with load control device ""([^""]*)""")]
让<代码>*不情愿也可以:

[When(@"I Schedule a Start Now Event named ""(.*?)"" for the DR program named ""(.*?)""")]

[When(@"I Schedule a Start Now Event named ""(.*?)"" for the DR program named ""(.*?)"" with load control device ""(.*?)""")]

…但是否定字符类更简单。免责声明:我自己不是SpecFlow用户,但似乎证实了我的猜测。

这是一个regex模式问题,但也是一个相当常见的问题

基本上,regex
*
被称为贪婪。从它出现的地方开始,它将匹配所有它能匹配的东西,直到有东西迫使它不匹配为止。艾伦·摩尔关于使用引号的建议将非常有效。另一种方法是使用不包含空格的名称,然后可以使用
[^]*
表示匹配许多不包含空格的名称

实际上,我建议您可能会发现使用较小的语句构建查询更容易。比如说

Given a DR program called xxx
And a load control device xxx
When I schedule a Start now event named xxx

private string drProgramName;
private string loadControlDevice;

[Given("a DR program called (.*)"]
public void GivenADRProgramCalled(string name)
{
  drProgamName = name;
}

[Given("a load control device (.*)"]
public void GivenALoadControlDevice(string name)
{
  loadControlDevice = name;
}

[When("I schedule a start now event named (.*)")]
public void WhenIScheduleAStartNowEventNamed(string name)
{
  WhenIScheduleAStartNowEventNamed(name, drProgamName, loadControlDevice);
}
这篇文章真的解决了我的问题。艾伦,干杯