Преобразование аргумента шага 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 ответа:
Я создал небольшой прототип, который можно использовать для перенастройки Assist, чтобы иметь возможность подбирать преобразования с привязками
Мой план состоит в том, чтобы сделать запись в блоге об этом, но пока она не готова, возможно, вы сможете извлечь суть из этой сути. (Я сделал это год назад для SpecFlow v2.0, поэтому могут потребоваться некоторые небольшие адаптации.)[StepArgumentTransformation]
.
Я не думаю, что то, что вы хотите, реализуется в настоящее время, но теоретически я думаю, что это может быть реализовано. Вероятно, вы можете реализовать новый, улучшенный
DateTimeValueRetriever
, который сначала проверяет, можно ли разобрать строку как datetime, а если нет, то проверяет, может ли какой-либо из методов[StepArgumentTransformation]
ее разобрать, а затем заменяет текущийDateTimeValueRetriever
вашим улучшенным. Затем вы можете представить pr, предлагающий вашу новую версию в качестве дополнения к существующей версии, и посмотреть, каков аппетит.