Specflow表列绑定可防止Null

时间:2017-06-23 15:52:25

标签: bdd specflow

给出以下代码:

public class Bob {
   public string Name { get; set; }
   public int Age { get; set; }
   public decimal Height { get; set; }
}

Feature: Bob checker

Scenario: Check Bob
  Given I have the following Bob
     | Name   | Age | Hieght |
     | Robert | 63  | 1.87   |
  When . . . . 
  Then . . . . 

[Given(@"I have the following Bob")]
public void IHaveTheFollowingBob(Table table) {
    var bob = table.CreateInstance<Bob>();
}

你会注意到表中没有正确拼写“高度”这个词。 CreateInstance方法仍然有效,但Bob对象的'Height'将为0或引用类型为null。

如果列未绑定到提供的Type,是否有办法使SpecFlow失败。谢谢

2 个答案:

答案 0 :(得分:1)

如果某列与任何类属性都不匹配,则不会抛出错误。

然而,有一个工作周期。您可以实现一种方法来检查是否存在“无效”列以防止拼写错误:

    [Given("I have the following Bob")]
    public void TestMethod1(Table table)
    {
        AssertAllTableColumnsMatch<Bob>(table);

        var bob = table.CreateInstance<Bob>();
    }

    public void AssertAllTableColumnsMatch<T>(Table table)
    {
        foreach (var header in table.Header)
        {
            bool columnHeaderMatches = HasProperty(typeof(T), header);

            Assert.IsTrue(columnHeaderMatches,
                string.Format("The column header [{0}] does not match any property of the type [{1}]",
                header, typeof(T).Name));
        }
    }

    private bool HasProperty(Type obj, string propertyName)
    {
        return obj.GetProperty(propertyName) != null;
    }

将抛出以下错误: -> error: Assert.IsTrue failed. The column header [Hieght] does not match any property of the type [Bob]

该方法只是迭代所有列,并检查提供的类型是否具有此类属性。

答案 1 :(得分:0)

我应该RTFM。 table.CompareToInstance(bob);如果属性不存在或未正确填充,则会失败。如果将此与table.CreateInstance结合使用,则会在存在空值时出现故障。在这里留下Q&amp; A以防万一其他人脑部失败。

SpecFlow Assist Helper, CompareToInstance

如果您有复杂的类型,可以在表格中表示它们并使用IValueRetrieverIValueComparer extensions

例如,请考虑以下micky鼠标代码:

public class Bob {
   public string Name { get; set; }
   public int Age { get; set; }
   public decimal Height { get; set; }
}

public class BobModel {
   public string Name { get; set; }
   public int Age { get; set; }
   public decimal Height { get; set; }
}

Feature: Bob checker

Scenario: Check Bob
  Given I have the following Bob
     | Name   | Age | Hieght |
     | Robert | 63  | 1.87   |
  When I map this to the model
  Then Bob the model looks like this
     | Name   | Age | Height |
     | Robert | 63  | 1.87   |

[Given(@"I have the following Bob")]
public void IHaveTheFollowingBob(Table table) {
    var bob = table.CreateInstance<Bob>();
}

[When(@"I map this to the model")]
public void IMapThisToTheModel() {
   sut = production.Map(bob);
}

[Then(@"Bob the model looks like this") {
public void BobTheModelLooksLikeThis(Table table) {
   table.CompareToInstance<BobModel>(sut);
}

在这种情况下,如果第二个表中存在拼写错误,则表示无法找到该属性。如果第一个表中有拼写错误,那么这仍然是null,但断言将失败。没有误报