Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';为集成测试创建对象(域模型)的最佳通用/自动化方法是什么?_C#_Asp.net Mvc_Unit Testing_Automated Tests_Integration Testing - Fatal编程技术网

C# 什么';为集成测试创建对象(域模型)的最佳通用/自动化方法是什么?

C# 什么';为集成测试创建对象(域模型)的最佳通用/自动化方法是什么?,c#,asp.net-mvc,unit-testing,automated-tests,integration-testing,C#,Asp.net Mvc,Unit Testing,Automated Tests,Integration Testing,我想为多层应用程序创建易于维护的集成测试,但我遇到了一个问题,那就是如何找到一种灵活的方法来创建我的对象。此外,我想保留有时控制对象创建的可能性 在测试中,我创建对象(域模型),将它们持久化到数据库中,从odata控制器的响应中检索由域逻辑过滤的对象,将它们序列化回域模型,并将它们与预期返回的对象进行比较 到目前为止,我尝试在我的场景中结合FizzWare NBuilder使用Specflow的数据表,但是我已经看到维护测试并不方便,因为域模型中的任何微小更改都可能导致需要更新集成测试项目的多个

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

在测试中,我创建对象(域模型),将它们持久化到数据库中,从odata控制器的响应中检索由域逻辑过滤的对象,将它们序列化回域模型,并将它们与预期返回的对象进行比较

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

是否有任何通用的、自动化的方法来实现这一点


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

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

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

这里有一个非常简单的例子

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);
    }
}
公共类人物
{
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串全名
{
得到
{
返回string.Format(“{0}{1}”,FirstName,Lastname);
}
}
}
[测试类]
公共类UnitTest1
{
[测试方法]
公共无效FullNamePropertyResolved()
{
var fixture=新fixture();
var sut=fixture.Create();
var expectedFullName=string.Format(“{0}{1}”,sut.FirstName,sut.Lastname);
Assert.AreEqual(expectedFullName,sut.FullName);
}
}

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

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

这里有一个非常简单的例子

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);
    }
}
公共类人物
{
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串全名
{
得到
{
返回string.Format(“{0}{1}”,FirstName,Lastname);
}
}
}
[测试类]
公共类UnitTest1
{
[测试方法]
公共无效FullNamePropertyResolved()
{
var fixture=新fixture();
var sut=fixture.Create();
var expectedFullName=string.Format(“{0}{1}”,sut.FirstName,sut.Lastname);
Assert.AreEqual(expectedFullName,sut.FullName);
}
}

为什么要发表评论?这似乎是一个合适的答案。您自己使用过autofixture吗?不确定使用该框架描述业务数据将如何更容易。请详细说明您的答案(例如,用几个示例)。我刚刚用一个简单的示例更新了我的答案。我正在使用它,它非常有用。不过,感谢您的回答我想知道3件事。1.我能用这个框架以任何方式控制生成字符串的长度或生成数字的范围吗?2.我能毫无问题地将生成的对象强制转换到我的域模型吗?(将从我的数据服务接收到的数据与生成的对象进行比较)3.此框架是否能正确处理具有循环引用的类型?@AndrewB 1.是的。2.生成的对象属于您要求的类型。您为什么需要强制转换它们?3.否。为什么要添加注释?这似乎是一个合适的答案。您自己使用过autofixture吗?不确定使用该框架如何更容易描述业务数据ork。请用几个例子详细说明你的答案。我刚刚用一个简单的例子更新了我的答案。我正在使用它,它非常有用。谢谢你的回答,但是我想知道3件事。1.我能用这个框架以任何方式控制生成字符串的长度或生成数字的范围吗?2.我能转换泛型吗ted对象到我的域模型没有问题?(将从我的数据服务接收到的数据与生成的对象进行比较)3.此框架是否与具有循环引用的类型一起正常工作?@AndrewB 1.是。2.生成的对象属于您要求的类型。为什么需要强制转换它们?3.否。