Преобразование аргумента шага Specflow для содержимого ячеек таблицы с помощью CreateInstance


Кто-нибудь решил загадку о том, как применять преобразования аргументов шага SpecFlow к ячейкам таблицы в сочетании с SpecFlow.Помочь CreateInstance/CreateSet? (код объединен здесь, чтобы сэкономить место)

Given a table like the following:
 | Price | Zip   | Effective Date |
 | 10.00 | 90210 | in 2 days      |
When the 'given' step executes
And the table data populates a poco
Then the effective date should be transformed into a DateTime with value of 2 days from today

[Given(@"a table like the following:")]
public void GivenATableLikeTheFollowing(Table table)
{
    var temp = table.CreateInstance<Temp>();
}

internal class Temp
{
    decimal Price { get; set; }
    int Zip { get; set; }
    DateTime EffectiveDate { get; set; }
}

[Binding]
public class Transforms
{
    [StepArgumentTransformation(@"in (d+) days?")]
    public DateTime InXDaysTransform(int days)
   {
      return DateTime.Today.AddDays(days);
   }
}

Привязки StepArgumentTransformation , по-видимому, не применяются к содержимому ячеек таблицы (поскольку аргумент шага - Type Table), но каким-то образом SpecFlow.Помощь метод createinstance/CreateSet будет еще преобразовать данные в ячейке для основных типов.

Например , если дата вступления в силу содержит "11/13/2016" вместо "через 2 дня", свойство EffectiveDate базового poco преобразуется в DateTime просто отлично (или int, decimal и т. д.).

Я вижу некоторые другие решения, такие как применение преобразования в самом определении шага, как здесь или создание StepArgumentTransformation для всей таблицы, но... очевидные минусы. Обновление: этот вопрос похож, но решения также избегают смешивания StepArgumentTransformation с CreateInstance / CreateSet.

Есть также раздел в SpecFlow Assist Helpers docs о расширении путем регистрации значений retrievers/comparers, но в моем примере набор DateTime уже существует. Итак, возможно, пользовательский тип DateTime? Похоже, что, возможно, существует проверка на StepArgumentTransformations на известных типах или что-то в этом роде.

В ретривере DateTime , что-то вроде..

    public virtual DateTime GetValue(string value)
    {
        var returnValue = DateTime.MinValue;
        // check for StepArgumentTransformations here first?
        DateTime.TryParse(value, out returnValue);
        return returnValue;
    }

Любой идеи о том, чего мне не хватает, чтобы получить StepArgumentTransformation для применения к содержимому ячеек таблицы при использовании таблицы.Создать систему? Или одно из упомянутых решений является лучшим / единственным способом?

2 4

2 ответа:

Я создал небольшой прототип, который можно использовать для перенастройки Assist, чтобы иметь возможность подбирать преобразования с привязками [StepArgumentTransformation].

Мой план состоит в том, чтобы сделать запись в блоге об этом, но пока она не готова, возможно, вы сможете извлечь суть из этой сути. (Я сделал это год назад для SpecFlow v2.0, поэтому могут потребоваться некоторые небольшие адаптации.)

Https://gist.github.com/gasparnagy/a478e5b7ccb8f557a6dc

Я не думаю, что то, что вы хотите, реализуется в настоящее время, но теоретически я думаю, что это может быть реализовано. Вероятно, вы можете реализовать новый, улучшенный DateTimeValueRetriever, который сначала проверяет, можно ли разобрать строку как datetime, а если нет, то проверяет, может ли какой-либо из методов [StepArgumentTransformation] ее разобрать, а затем заменяет текущий DateTimeValueRetriever вашим улучшенным. Затем вы можете представить pr, предлагающий вашу новую версию в качестве дополнения к существующей версии, и посмотреть, каков аппетит.