单元测试自定义异常

时间:2014-11-11 20:41:17

标签: c# unit-testing mstest custom-exceptions

我的代码覆盖率已将我的自定义异常列为0测试覆盖率。我正在使用MsTest,Moq和Fluentassertions。是否有针对自定义异常的适当单元测试?

这是我的异常类

  public class ConfigurationNotFoundException : Exception
    {
        public ConfigurationNotFoundException()
        {
        }

        public ConfigurationNotFoundException(string message) : base(message)
        {
        }

        public ConfigurationNotFoundException(string message, Exception innerException) : base(message, innerException)
        {
        }

        protected ConfigurationNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context)
        {
        }
    }

3 个答案:

答案 0 :(得分:3)

您可以编写一个调用每个构造函数的测试,以满足您的代码覆盖率工具。但是你应该确定自己需要测试哪些代码。如果您希望获得100%的覆盖率,请继续编写一个糟糕的单元测试,但最好还是看看为什么要编写测试。添加一个简单的单元测试是否会提高代码的质量?

答案 1 :(得分:2)

如果它显示为0%的覆盖率,那是因为它未使用/未经测试。

使用原始的自定义异常类,以及使用它的这个漂亮的类:

public class SomeClass
{
    public void SomeMethod()
    {
        throw new ConfigurationNotFoundException("Hey!");
    }
}

如果我有以下单元测试(使用流利断言):

[TestClass]
public class SomeClassTest
{
    [TestMethod]
    public void SomeMethodShouldThrow()
    {
        Action invocation = () => new SomeClass().SomeMethod();

        invocation.ShouldThrow<ConfigurationNotFoundException>().WithMessage("Hey!");
    }
}

coverage正确显示所使用的构造函数:

Coverage result


因此,如果未涵盖,则未经测试或未使用。

要验证它是否未使用,您可以右键单击方法名称并选择“查找用法”。如果你有'没有用法&#39;消息,您可以安全地删除它。

如果使用但未经测试;测试它(行为,而不是异常类本身)。


在前面的示例中,您只需要以下内容:

public class ConfigurationNotFoundException : Exception
{
    public ConfigurationNotFoundException(string message)
        : base(message)
    {
    }
}

其他构造函数不需要从Exception继承,并且只会使类混乱,因为它们没有用处。

答案 2 :(得分:1)

当然你可以编写调用三个公共构造函数的单元测试。本质上,您的测试将验证构造函数本身不会抛出异常,并且您可以验证消息和innerException是否已正确存储。

但是,这也意味着您没有使用使用此异常的代码。如果你有一个可以抛出这个自定义异常的MethodA,那么你需要确保你的一个测试实际上导致MethodA抛出异常