如何向泛型方法传入string类型的null值?单元测试遇类型参数问题
问题原因
报错「Unable to determine type arguments for method」的核心问题是:当测试用例传入的expectedValue为null(比如default(string))时,NUnit没法从null推断出泛型方法TestMethod<T>的类型参数T——毕竟null可以对应任何引用类型,没有明确的类型标识。
可行解决方案
针对你这种批量循环生成多类型测试用例的场景,推荐两种直接的解决办法:
方法1:动态给每个TestCaseData设置TypeArgs
循环时根据每个默认值的实际类型,给对应的TestCaseData显式指定泛型参数类型,让NUnit不用自己推断:
public static IEnumerable<TestCaseData> TestCases { get { var defaultValues = new List<object> { default(DateTime), default(string), default(int) }; foreach (var value in defaultValues) { // 给每个测试用例设置TypeArgs yield return new TestCaseData(string.Empty, value).SetTypeArgs(value.GetType()); yield return new TestCaseData("", value).SetTypeArgs(value.GetType()); yield return new TestCaseData(" ", value).SetTypeArgs(value.GetType()); } } }
方法2:调整测试用例的数据源结构
把类型信息和默认值绑定,让测试方法能明确拿到类型标识,辅助NUnit完成推断:
[Test] [TestCaseSource(nameof(TestCases))] public void TestMethod<T>(Type targetType, string passedValue, T expectedValue) { var result = sut.GetValueFrom<T>(passedValue); result.Should().Be(expectedValue); } public static IEnumerable<TestCaseData> TestCases { get { // 把类型和默认值配对存储 var testItems = new List<(Type Type, object DefaultValue)> { (typeof(DateTime), default(DateTime)), (typeof(string), default(string)), (typeof(int), default(int)) }; foreach (var item in testItems) { yield return new TestCaseData(item.Type, string.Empty, item.DefaultValue); yield return new TestCaseData(item.Type, "", item.DefaultValue); yield return new TestCaseData(item.Type, " ", item.DefaultValue); } } }
额外提醒
你的GetValueFrom<TValue>方法用了Convert.ChangeType,当给值类型(比如int、DateTime)传入空字符串时会直接抛出异常,要么在方法里加异常处理,要么调整测试用例的输入值(比如给DateTime传合法的空格式字符串、给int传"0"),避免测试失败。
内容的提问来源于stack exchange,提问作者Wince
相关产品推荐
相关产品推荐

