为单元测试创建非法参数类的抽象方法

本文关键字:抽象方法 参数 非法 单元测试 创建 | 更新日期: 2023-09-27 18:32:07

我们基于列的数据库的数据字段映射到DataField类中。在每个数据字段对象上,可以调用 GetValue<T>() 方法。

如果T是非法类型,则会引发异常。我应该在单元测试中通过什么类型,在单元测试中测试如果我通过非法类型是否会引发异常?我想到的下一个已知的非法类型?还是有没有一种更抽象的方法?

public object GetValue<T>()
{
    if (typeof(T) == typeof(string)) return ValueString;
    if (typeof(T) == typeof(int?)) return ValueInt;
    if (typeof(T) == typeof(double?)) return ValueDouble;
    if (typeof(T) == typeof(DateTime?)) return ValueDateTime;
    if (typeof(T) == typeof(bool)) return ValueBoolean == true;
    var ex = new Exception("Following type is not supported: " + typeof(T));
    Log.Error(ex);
    throw ex;
}

因此,除了那些类型之外的每个类型都应该在通过时抛出此异常。所以我需要一种虚拟类型,对吧?

目前我的单元测试如下所示:

[Fact]
public void If_T_is_illegal_type_an_exception_gets_thrown()
{
    _dataField = new DataField(_params);
    Assert.Throws<Exception>(() => _dataField.GetValue<Type>());
}

为单元测试创建非法参数类的抽象方法

请记住,单元测试是尝试通过所有代码路径并确保正确的行为。您总共应该有 6 个测试:5 种有效类型中的每一种测试一个,以及任何其他类型(如您当前拥有的)一个测试,以涵盖最终代码路径。不知道为什么你需要一些更抽象的东西。

您可能更喜欢使用显式转换和强制转换,以便这成为编译时测试而不是运行时:http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.100).aspx

目前,

如果您调用GetValue<bool>(),您的代码将调用typeof(T) 五次并进行 5 次比较。然后它将返回盒装布尔值作为对象。最糟糕的是,此方法的签名没有说明允许哪些类型以及哪些类型将引发异常。我可以打电话给GetValue<decimal>()吗?不知道。如果不允许,我应该尝试使用运行时异常。

请考虑为所需类型创建重载方法:

bool GetBooleanValue()
decimal GetDecimalValue()

这完美地描述了它可以返回的类型。里面没有长长的如果链。调用方不会接收对象。您将毫无问题地测试每种方法。

如上所述,对每个受支持的类型进行一次测试,对不支持的类型进行一次测试就足够了。

不过,我确实注意到的一件事是,异常并不是错误的唯一预期结果。如何验证是否记录了错误?
你有办法做到这一点吗?
如果没有,你想要/需要一个吗?

此外,一个完全不请自来的代码审查点... 为什么

if (typeof(T) == typeof(bool)) return ValueBoolean == true; 

而不是

if (typeof(T) == typeof(bool)) return ValueBoolean; 

艾伦。