テーブルを介してSpecflowにnull値を入力するにはどうすればよいですか?
過度に単純化された例を見てみましょう。
When a tire is attached to a car
| CarId | TireModel | FabricationDate | Batch |
| 1 | Nokian Hakka R | 2015-09-1 | |
[バッチ]列の空の文字列は、specflowによってテキストとして解釈されるため、空の文字列として解釈されます。その列をnullとしてマークするための特別な構文はありますか?
独自のIValueRetrieverを作成し、デフォルトのものを自分のものに置き換えることができます
public class StringValueRetriver : IValueRetriever
{
public bool CanRetrieve(KeyValuePair<string, string> keyValuePair, Type targetType, Type propertyType)
{
return propertyType == typeof(string);
}
public object Retrieve(KeyValuePair<string, string> keyValuePair, Type targetType, Type propertyType)
{
return string.IsNullOrEmpty(keyValuePair.Value) ? null : keyValuePair.Value;
}
}
シナリオの一部のステップ
[BeforeScenario]
public void BeforeScenario()
{
var defaultStringValueRetriever = Service.Instance.ValueRetrievers.FirstOrDefault(vr => vr is TechTalk.SpecFlow.Assist.ValueRetrievers.StringValueRetriever);
if (defaultStringValueRetriever != null)
{
Service.Instance.UnregisterValueRetriever(defaultStringValueRetriever);
Service.Instance.RegisterValueRetriever(new StringValueRetriver());
}
Nullに特別な構文があるとは思わないので、変換を自分で処理する必要があると思います。 値レトリーバーはv2ブランチで改訂されました 標準の文字列値レトリーバーの登録を解除し、特別な構文を探してnullを返す独自の実装を登録することでこれを処理できる場合があります。
現在の1.9。*バージョンでは、空の文字列をチェックして自分でnullを返す必要があると思います。
単純な拡張メソッドを使用して、ケースバイケースでこれを行うことを選択しました。
ハンドラーで、渡されたサンプル値パラメーターを変換し、NullIfEmpty()を呼び出します。
使用例
AndICheckTheBatchNumber(string batch) {
batch = batch.NullIfEmpty();
//use batch as null how you intended
}
拡張方法
using System;
namespace Util.Extensions
{
public static class StringExtensions
{
public static string NullIfEmpty(this string str)
{
if (string.IsNullOrEmpty(str))
{
return null;
}
return str;
}
}
}