我的代码覆盖率已将我的自定义异常列为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)
{
}
}
答案 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正确显示所使用的构造函数:
因此,如果未涵盖,则未经测试或未使用。
要验证它是否未使用,您可以右键单击方法名称并选择“查找用法”。如果你有'没有用法&#39;消息,您可以安全地删除它。
如果使用但未经测试;测试它(行为,而不是异常类本身)。
在前面的示例中,您只需要以下内容:
public class ConfigurationNotFoundException : Exception
{
public ConfigurationNotFoundException(string message)
: base(message)
{
}
}
其他构造函数不需要从Exception
继承,并且只会使类混乱,因为它们没有用处。
答案 2 :(得分:1)
当然你可以编写调用三个公共构造函数的单元测试。本质上,您的测试将验证构造函数本身不会抛出异常,并且您可以验证消息和innerException是否已正确存储。
但是,这也意味着您没有使用使用此异常的代码。如果你有一个可以抛出这个自定义异常的MethodA,那么你需要确保你的一个测试实际上导致MethodA抛出异常。