gpt4 book ai didi

c# - 如何在大而复杂的类中实现单元测试?

转载 作者:可可西里 更新时间:2023-11-01 02:59:15 25 4
gpt4 key购买 nike

我正在一个涉及多项计算的财务系统中实现单元测试。其中一种方法,通过参数接收一个具有100多个属性的对象,并根据这个对象的属性,计算返回值。为了对该方法实现单元测试,我需要为该对象的所有内容填充有效值。

所以...问题:今天这个对象是通过数据库填充的。在我的单元测试中(我使用的是 NUnit),我需要避开数据库并为其创建一个模拟对象,以仅测试方法的返回值。我怎样才能用这个巨大的对象有效地测试这个方法?我真的需要手动填写它的所有 100 个属性吗?有没有一种方法可以使用 Moq(例如)自动创建这个对象?

obs:我正在为已经创建的系统编写单元测试。此时重写所有架构是不可行的。
一百万!

最佳答案

如果这 100 个值不相关并且您只需要其中的一些值,那么您有多种选择。

您可以创建新对象(属性将使用默认值初始化,如 null 用于字符串,0 用于整数)并仅分配必需的属性:

 var obj = new HugeObject();
obj.Foo = 42;
obj.Bar = "banana";

您还可以使用一些库,例如 AutoFixture这将为您的对象中的所有属性分配虚拟值:

 var fixture = new Fixture();
var obj = fixture.Create<HugeObject>();

您可以手动分配所需的属性,也可以使用 fixture builder

 var obj = fixture.Build<HugeObject>()
.With(o => o.Foo, 42)
.With(o => o.Bar, "banana")
.Create();

用于相同目的的另一个有用的库是 NBuilder


注意:如果所有属性都与您正在测试的功能相关并且它们应该具有特定值,则没有库可以猜测您的测试所需的值。唯一的方法是手动指定测试值。如果您在每次测试之前设置一些默认值并仅更改特定测试所需的内容,则可以减少很多工作。 IE。创建辅助方法,它将创建具有预定义值集的对象:

 private HugeObject CreateValidInvoice()
{
return new HugeObject {
Foo = 42,
Bar = "banaba",
//...
};
}

然后在您的测试中覆盖一些字段:

 var obj = CreateValidInvoice();
obj.Bar = "apple";
// ...

关于c# - 如何在大而复杂的类中实现单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42363292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com