如何在specflow步骤定义表中输入null值

时间:2015-10-02 13:46:38

标签: bdd specflow gherkin

如何通过表格在Specflow中输入空值?

让我们看一个过于简单的例子:

When a tire is attached to a car
| CarId | TireModel      | FabricationDate | Batch |
| 1     | Nokian Hakka R | 2015-09-1       |       |

Batch列中的空字符串按specflow解释为文本,因此为空字符串。是否有特殊语法将该列标记为null?

4 个答案:

答案 0 :(得分:12)

您可以创建自己的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());
        }

答案 1 :(得分:2)

我不相信null的特殊语法,我认为你必须自己处理转换。 value retrievers have been revised in the v2 branch并且您可以通过取消注册标准字符串值检索器并注册自己的实现来查找某些特殊语法并返回null来处理此问题。

在当前的1.9。*版本中虽然我认为你只需要检查空字符串并自己返回null。

答案 2 :(得分:1)

我选择使用简单的扩展方法逐个案例地执行此操作。

在处理程序中,我转换传入的示例值参数并调用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;
        }
    }
}

答案 3 :(得分:1)

从 SpecFlow 3 开始,您可以在 Steps 类中输入以下代码。在功能文件中,只需像这样放置空值。现在,当您使用 CreateSet 函数时,它将被正确反序列化。

Id | Value
1  | <null> 

[Binding]
public static class YourStepClass
{
    [BeforeTestRun]
    public static void BeforeTestRun()
    {
        Service.Instance.ValueRetrievers.Register(new NullValueRetriever("<null>"));
    }
}