SpecFlow绑定中的歧义

时间:2015-06-15 13:25:07

标签: c# .net bdd specflow

我使用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完全匹配?

3 个答案:

答案 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/

或在这里:

https://github.com/techtalk/SpecFlow/wiki/Scoped-bindings