给出以下代码:
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失败。谢谢
答案 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
如果您有复杂的类型,可以在表格中表示它们并使用IValueRetriever
和IValueComparer
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,但断言将失败。没有误报