我使用Spec-flow已经有好几天了。我正面临“找到多个匹配。导航到第一个匹配”,而调试这个可以解决,但是当我运行整个解决方案时由于绑定中的歧义而失败。我在单个项目中运行了4个C类的文件
Feature: ConversionUnencrypted Pdf-Pdf
@mytag
Scenario Outline: ConversionUnencrypted Pdf-Pdf
Given I get Inputs Folder and list of Files <inputFolder> then <getInputTokens>(Multiple bindings for this line)
Given I get <outputDirectory>
Given I set saving Mode <ConversionMode>
Given I convert pdf using Conversion
Given I convert to Image <convertToFile>
Then I compare Images <getActualImagePath> and <getExpectedImagePath> and <pageCount>
和步骤定义:
**Binding for Multiple steps is the below binding:**
第一次绑定:
[Given(@"I get Inputs Folder and list of Files (.*) then (.*)")]
public void GivenIGetInputsFolderAndListOfFilesThen(string getInputFolder, string getInputTokens)
{
--logic--
}
第二次绑定:
[Given(@"I get (.*)")]
public void GivenIGet(string getOutputDirectory)
{
--logic--
}
第二个绑定修改为:
Given I set OutputDirectory of Pdf <outputDirectory>
[Given]
public void Given_I_set_OutputDirectory_of_Pdf_P0(string p0)
{
--logic--
}
这个也没有帮助我。尝试过Regex仍然无法解决问题。 在上面提到的2个绑定中存在歧义。它不仅仅是一个功能,它也观察到其他功能文件。 如何解决这一问题,使每一行与一个Binding完全匹配?
答案 0 :(得分:5)
正如@perfectionist指出你的问题与你的正则表达式有关。一个是消耗两者的所有字符。试试这个:
Feature: ConversionUnencrypted Pdf-Pdf
@mytag
Scenario Outline: ConversionUnencrypted Pdf-Pdf
Given I get Inputs Folder and list of Files '<inputFolder>' then '<getInputTokens>'
Given I get '<outputDirectory>'
...
和步骤定义:
[Given(@"I get Inputs Folder and list of Files '([^']*)' then '([^']*)'")]
public void GivenIGetInputsFolderAndListOfFilesThen(string getInputFolder, string getInputTokens)
{
}
[Given(@"I get '([^']*)'")]
public void GivenIGet(string getOutputDirectory)
{
--logic--
}
只有当输入不包含'
字符时,此正则表达式才会匹配,因此在使用输入并匹配较长方法时会阻止第二种方法过于贪婪。
作为一般规则,我更喜欢在场景中将字符串字符包含在单引号中,因为它会使这样的问题更容易缓解
显然,只有当您的输入'<inputFolder>','<getInputTokens>' and <outputFolder>
不包含任何'
字符时,上述内容才有效。如果他们这样做,那么你可能需要一个更复杂的正则表达式
答案 1 :(得分:3)
我想我可以猜出丢失的信息。
问题出在这两行的绑定中:
Given I get Inputs Folder and list of Files <inputFolder> then <getInputTokens>
Given I get <outputDirectory>
您给出的第一个绑定:
[Given(@"I get Inputs Folder and list of Files (.*) then (.*)")]
public void GivenIGetInputsFolderAndListOfFilesThen(string getInputFolder, string getInputTokens)
{
// etc
}
我猜测第二次绑定。
[Given(@"I get (.*)")]
public void GivenIGet(string outputDirectory)
{
// etc
}
第二个绑定匹配任何以&#34开头的文本;鉴于我得到&#34;,当然包括任何开始的文本&#34;鉴于我得到输入文件夹和文件列表......&#34; < / p>
如果你想避免绑定冲突,你需要更加具体,因为我得到了&#34;捆绑。在这样做的时候,你应该选择商业专家(而不是代码专家)为你的步骤理解的语言 - &#34;我得到&#34;可能不是商业专家会说的话。但在高技术组织中可能会出现这种情况 - 在这种情况下,您需要使Regex与文件路径/ uri更具针对性。
如果不了解Regex,则无法有效使用Specflow。 (.*)
是最可能允许的捕获组,即使默认情况下由specflow插件提供,它也很少是一个好的答案。要获得可以使用的快速字符列表,并测试正则表达式的想法,为什么不查看rubular.com。
答案 2 :(得分:2)
您需要使用Scoped Bindings,以便可以对具有相同描述的方案和步骤进行分区。请参阅此处的演练:
http://www.specflow.org/documentation/Scoped-bindings/
或在这里: