c# - 具有泛型类型的单元测试
问题描述
我想用泛型测试一个单元测试,我正在努力寻找正确的方法。
我有这个
[TestCase(typeof(CalendarGeneralCsv), typeof(CalendarGeneralCsvMap), 121)]
public void ReadFromCsvFileWithConfigurationMapTest<T,Tmap>(T t, Tmap tmap, int totalRowsExptected)
{
//Arrange
//Act
var records = csvService.ReadFileCsv<T, Tmap>(_csvToRead, ",") as IEnumerable<object>;
var result = new List<object>(records);
//Assert
result.Should().NotBeNullOrEmpty();
result.Should().HaveCount(totalRowsExptected);
}
错误在这一行
var records = csvService.ReadFileCsv<T, Tmap>(_csvToRead, ",") as IEnumerable<object>;
说T,Tmap一定是引用类型。
解决方案
我通常不会在已经有几个答案并且一个被接受的情况下回复,但它们似乎都是基于测试方法不能通用的假设。他们绝对可以。我的记忆告诉我,这曾经有据可查,但它似乎不再存在——或者我的记忆错了——这解释了为什么你可能认为它不可能。
通用解决方案可能在这里可能不是最好的,但尝试起来似乎很有趣,并且可能会更好或阐明为什么接受的解决方案更好。我只能使用已经提供的信息,但如果 jolynice 会合作,也许我们可以学到一些东西。:-)
所以......这是一个解决方案的初步尝试,如果有更多信息回来,我将对其进行编辑。
问题中的原始解决方案会导致错误,因为ReadFileCsv<T, Tmap>(...)
不满足泛型方法中的约束。我们不知道它们是什么,但从它们包括的错误T : class
和Tmap : class
. 因此,正确答案的第一步是在测试方法本身上重现被调用方法的所有约束。
更新:此代码实际上不起作用。短篇小说,我在本地拥有该功能,我认为它已添加到 NUnit 中,但事实并非如此。请参阅下面的更新文本...
[TestCase(typeof(CalendarGeneralCsv), typeof(CalendarGeneralCsvMap), 121)]
public void ReadFromCsvFileWithConfigurationMapTest<T,Tmap>(int totalRowsExptected)
where T : class
where Tmap : class
{
//Arrange
//Act
var records = csvService.ReadFileCsv<T, Tmap>(_csvToRead, ",") as IEnumerable<object>;
var result = new List<object>(records);
//Assert
result.Should().NotBeNullOrEmpty();
result.Should().HaveCount(totalRowsExptected);
}
更新以回应@Jannes 评论
您可以在 C# 中创建不带参数的泛型方法。如果您使用这样的方法作为测试方法,NUnit 需要知道用于调用它的实际类型。不幸的是,没有这样的方法。
目前,NUnit 只能从您提供的参数中推断出实际类型。这意味着泛型方法的每个参数类型必须至少有一个参数。
这显然是 NUnit 中的一个空白,并且已在 GitHub 上的各种问题中进行了讨论。到目前为止,尚未接受任何提案。例如,请参阅https://github.com/nunit/nunit/issues上的问题 150、1215、2562 和 3576 。
推荐阅读
- c - 为什么获取信号量和wait()的值会有问题
- c# - LUIS 异常:操作返回了无效的状态代码“禁止”
- mysql - 循环遍历每个数据库并为海滩数据库创建文件夹,为数据库中的表创建文件夹,为每个表头创建文本文件
- reactjs - 部署 React 应用程序后在 GitHub 上丢失个人域的设置
- algorithm - 具有平行边的有向图的最小权重生成树
- java - Java 创建类的对象
- javascript - 如何在jQuery中声明变量
- javascript - jquery datatable第一列搜索和排序不起作用
- python - 使用“bazel test”时如何使用PDB?
- node.js - Node.js 异步循环问题