首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpecFlow和复杂对象

SpecFlow和复杂对象
EN

Stack Overflow用户
提问于 2011-04-26 18:24:10
回答 8查看 33.8K关注 0票数 21

我正在评估SpecFlow,但我有点卡住了。

我发现的所有样本基本上都是简单的对象。

我正在做的项目很大程度上依赖于一个复杂的对象。一个接近的样本可以是这个对象:

代码语言:javascript
复制
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将从“给定”步骤实例化,并在“何时”和“然后”步骤中使用?

提前感谢

编辑:只是脑海中的一枪:支持嵌套表吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-04-27 02:38:25

对于您所展示的示例,我认为是you're cuking it wrong。这个示例看起来更适合使用nunit编写,可能还会使用。使用specflow或类似工具编写的测试应该面向客户,并使用与客户用于描述功能的语言相同的语言。

票数 20
EN

Stack Overflow用户

发布于 2011-04-27 05:46:44

我想说马库斯在这里是非常正确的,但是我会写我的场景,这样我就可以在TechTalk.SpecFlow.Assist名称空间中使用的一些扩展方法。参见here

代码语言:javascript
复制
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        |

对于这些步骤背后的代码,你可以使用类似这样的代码来处理更多的错误。

代码语言:javascript
复制
    [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());
                }
            }
        }
    }

希望这篇(或其中的一些)能对你有所帮助。

票数 30
EN

Stack Overflow用户

发布于 2011-04-26 19:13:58

我建议您尽可能保持场景的整洁,重点关注项目中非技术人员的可读性。然后在您的步骤定义中处理如何构造复杂对象图。

尽管如此,你仍然需要一种在你的规范中表达层次结构的方法,也就是用小黄瓜。据我所知,这是不可能的,从this post (在SpecFlow谷歌小组中)来看,这似乎已经被讨论过了。

基本上,你可以发明一种你自己的格式,并在你的步骤中解析它。我自己还没有遇到过这种情况,但我想我会尝试一个下一级包含空值的表,并在步骤定义中解析它。如下所示:

代码语言:javascript
复制
Given I have the following hierarchical structure:
| MyObject.Id | StartDate | EndDate  | ChildObject.Id | Name | Length |
| 1           | 20010101  | 20010201 |                |      |        |
|             |           |          | 1              | Me   | 196    |
|             |           |          | 2              | You  | 120    |

我承认它不是非常漂亮,但它是可以工作的。

另一种方法是使用默认值,然后给出差异。如下所示:

代码语言:javascript
复制
Given a standard My Object with the following children:
| Id | Name | Length |
| 1  | Me   | 196    |
| 2  | You  | 120    |

然后,在步骤定义中为MyObject添加“标准”值,并填写子项列表。如果你问我,这种方法的可读性会更好一些,但你必须“知道”什么是标准MyObject以及它是如何配置的。

基本上--小黄瓜不支持它。但是你可以创建一种你可以自己解析的格式。

希望这能回答你的问题。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5788964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档