2015-06-15 3 views
3

Я работаю с Spec-flow в течение нескольких дней. Я столкнулся с «Множественным сопоставлением найдено.Навигация к первому совпадению», в то время как отладка этого может быть решена, но когда я запускаю все решение, это не работает из-за неоднозначности привязок. Я бегу около 4 C файлов диез класса в одном проектеSpecFlow Неоднозначность в привязках

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-- 
} 

Вторая модификация связывания d до:

Given I set OutputDirectory of Pdf <outputDirectory> 

[Given] 
public void Given_I_set_OutputDirectory_of_Pdf_P0(string p0) 
{ 
    --logic-- 
} 

Этот тоже не помогает мне. Попробовали Regex тоже не смогли решить проблему. В вышеупомянутых 2 привязках есть неоднозначность. Его не только в одной функции также наблюдается и другой файл с функциями. Как это можно решить, чтобы каждая строка соответствовала одному привязке?

+1

, пожалуйста, добавьте сведения о привязках шагов для нескольких шагов, которые соответствуют. у вас, вероятно, есть шаг, у которого есть регулярное выражение, которое слишком жадно. –

+1

Пожалуйста, вставьте свои фактические привязки в вопрос в качестве кода. Вручную вводить регулярное выражение и пропускать важные символы не позволит никому помочь. Вам нужно вставить оба конфликтующих шага, если вы этого не сделаете, никто не сможет помочь. – perfectionist

+0

Вы добавили привязку к одному шагу, но если вам нужно несколько совпадений, вам нужно вставить ** ALL **, которые соответствуют, поэтому мы можем помочь вам определить, почему оба совпадают. Удалите привязку, которую вы опубликовали, а затем перейдите к привязке, чтобы найти другую, которая соответствует. Если других нет, убедитесь, что это привязка не относится к базовому классу, который имеет более одной реализации –

ответ

3

Как @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> не содержат любые ' символов. Если это так, вам может понадобиться более сложное регулярное выражение

+0

Спасибо, что это работает ..! –

2

Я думаю, что может угадать часть недостающей информации.

Проблема заключается в связывании этих двух линий:

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 
} 

второй фиксирующей спичек любой текст, начиная с «Учитывая, я получаю», в том числе, конечно, любой текст, который начинается «Учитывая, я получаю входы папки и список файлов ...»

Если вы хотите избегайте связывания конфликтов, вам нужно быть более конкретным с привязкой «данный я получаю». При этом вы должны выбрать язык, который эксперт по бизнесу (а не эксперт по коду) будет понимать для ваших шагов - «Я получаю», вероятно, не то, что сказал бы бизнес-эксперт. Но это может быть, в высокотехнологичных организациях - в этом случае вам нужно будет сделать Regex более точным, чтобы указать путь к файлу/uri.

Спектр не может эффективно использоваться без понимания регулярного выражения. (.*) - самая разрешительная группа захвата, и даже если она задана по умолчанию с помощью встроенного плагина, это редко бывает хорошим ответом. Чтобы получить быстрый список символов, которые вы можете использовать, и чтобы проверить идеи регулярных выражений, почему бы не посмотреть на rubular.com.

+0

. Хороший вопрос о бизнес-языке. –

Смежные вопросы