【问题标题】:What's the best generic/automated approach to create objects (domain models) for integration tests?为集成测试创建对象(域模型)的最佳通用/自动化方法是什么?
【发布时间】:2015-04-18 10:28:45
【问题描述】:

我想为多层应用程序创建易于维护的集成测试,但我遇到了一个问题,即找到一种灵活的方法来创建我的对象。此外,我想保留有时控制对象创建的可能性。

在我的测试中,我创建我的对象(域模型),将它们保存在数据库中,从我的 odata 控制器的响应中检索由域逻辑过滤的对象,将它们序列化回我的域模型,并将它们与原来的对象进行比较预计会被退回。

到目前为止,我尝试的是在我的场景中使用 Specflow 的数据表并结合 FizzWare NBuilder,但是我已经看到维护测试并不方便,因为域模型中的任何微小更改都可能导致需要更新集成测试项目的多个区域(在本例中为 NBuilder 对象配置和提供更改模型数据的每个规范流场景),因为我的应用程序的域模型和逻辑很复杂。

是否有任何通用的自动化方法来实现这一目标?

分享您在这件事上的知识/经验。

【问题讨论】:

    标签: c# asp.net-mvc unit-testing automated-tests integration-testing


    【解决方案1】:

    我会写评论,但我的名声不允许我这样做。

    看看 Autofixture 库。这是一个由 Mark Seemann 创建的开源库,它提供了一种自动创建带有假数据的对象以用于测试目的的方法:

    https://github.com/AutoFixture/AutoFixture

    这是一个非常简单的例子

    public class Person
    {
        public string FirstName { get; set; }
        public string Lastname { get; set; }
    
        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", FirstName, Lastname);
            }
        }
    }
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void FullNameProperlyResolved()
        {
            var fixture = new Fixture();
            var sut = fixture.Create<Person>();
            var expectedFullName = string.Format("{0} {1}", sut.FirstName, sut.Lastname); 
            Assert.AreEqual(expectedFullName, sut.FullName);
        }
    }
    

    【讨论】:

    • 为什么要评论?这似乎是一个合适的答案。
    • 您自己使用过 autofixture 吗?不确定使用该框架描述业务数据如何更容易。请详细说明您的答案,例如举几个例子
    • 我刚刚用一个简单的例子更新了我的答案。我实际上正在使用它,它非常有用。
    • 感谢您的回答,但我想知道 3 件事。 1.我可以使用这个框架以任何方式控制生成的字符串的长度或生成的数字的范围吗? 2. 我可以毫无问题地将生成的对象投射到我的域模型中吗? (比较从我的数据服务接收到的数据与生成的对象) 3. 这个框架是否适用于具有循环引用的类型?
    • @AndrewB 1. 是的。 2. 生成的对象是您要求的类型。为什么需要投射它们? 3.没有。
    猜你喜欢
    • 2012-05-28
    • 2010-10-24
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多