我正在评估SpecFlow,但我有点卡住了。
我发现的所有样本基本上都是简单的对象。
我正在做的项目很大程度上依赖于一个复杂的对象。一个接近的样本可以是这个对象:
public class MyObject
{
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public IList<ChildObject> Children { get; set; }
}
public class ChildObject
{
public int Id { get; set; }
public string Name { get; set; }
public int Length { get; set; }
}有谁知道如何编写我的特性/场景,其中MyObject将从“给定”步骤实例化,并在“何时”和“然后”步骤中使用?
提前感谢
编辑:只是脑海中的一枪:支持嵌套表吗?
发布于 2011-04-27 02:38:25
对于您所展示的示例,我认为是you're cuking it wrong。这个示例看起来更适合使用nunit编写,可能还会使用。使用specflow或类似工具编写的测试应该面向客户,并使用与客户用于描述功能的语言相同的语言。
发布于 2011-04-27 05:46:44
我想说马库斯在这里是非常正确的,但是我会写我的场景,这样我就可以在TechTalk.SpecFlow.Assist名称空间中使用的一些扩展方法。参见here。
Given I have the following Children:
| Id | Name | Length |
| 1 | John | 26 |
| 2 | Kate | 21 |
Given I have the following MyObject:
| Field | Value |
| Id | 1 |
| StartDate | 01/01/2011 |
| EndDate | 01/01/2011 |
| Children | 1,2 |对于这些步骤背后的代码,你可以使用类似这样的代码来处理更多的错误。
[Given(@"I have the following Children:")]
public void GivenIHaveTheFollowingChildren(Table table)
{
ScenarioContext.Current.Set(table.CreateSet<ChildObject>());
}
[Given(@"I have entered the following MyObject:")]
public void GivenIHaveEnteredTheFollowingMyObject(Table table)
{
var obj = table.CreateInstance<MyObject>();
var children = ScenarioContext.Current.Get<IEnumerable<ChildObject>>();
obj.Children = new List<ChildObject>();
foreach (var row in table.Rows)
{
if(row["Field"].Equals("Children"))
{
foreach (var childId in row["Value"].Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries))
{
obj.Children.Add(children
.Where(child => child.Id.Equals(Convert.ToInt32(childId)))
.First());
}
}
}
}希望这篇(或其中的一些)能对你有所帮助。
发布于 2011-04-26 19:13:58
我建议您尽可能保持场景的整洁,重点关注项目中非技术人员的可读性。然后在您的步骤定义中处理如何构造复杂对象图。
尽管如此,你仍然需要一种在你的规范中表达层次结构的方法,也就是用小黄瓜。据我所知,这是不可能的,从this post (在SpecFlow谷歌小组中)来看,这似乎已经被讨论过了。
基本上,你可以发明一种你自己的格式,并在你的步骤中解析它。我自己还没有遇到过这种情况,但我想我会尝试一个下一级包含空值的表,并在步骤定义中解析它。如下所示:
Given I have the following hierarchical structure:
| MyObject.Id | StartDate | EndDate | ChildObject.Id | Name | Length |
| 1 | 20010101 | 20010201 | | | |
| | | | 1 | Me | 196 |
| | | | 2 | You | 120 |我承认它不是非常漂亮,但它是可以工作的。
另一种方法是使用默认值,然后给出差异。如下所示:
Given a standard My Object with the following children:
| Id | Name | Length |
| 1 | Me | 196 |
| 2 | You | 120 |然后,在步骤定义中为MyObject添加“标准”值,并填写子项列表。如果你问我,这种方法的可读性会更好一些,但你必须“知道”什么是标准MyObject以及它是如何配置的。
基本上--小黄瓜不支持它。但是你可以创建一种你可以自己解析的格式。
希望这能回答你的问题。
https://stackoverflow.com/questions/5788964
复制相似问题