You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向泛型方法传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:42:18