如何模拟在单元测试中抛出异常
本文关键字:单元测试 抛出异常 模拟 何模拟 | 更新日期: 2023-09-27 18:20:25
如何模拟C#单元测试中抛出的异常?
我希望能够100%覆盖我的代码,但我不能测试可能出现异常的代码。例如,我无法模拟可能发生的电源故障。
例如:
public void MyMethod()
{
try
{
...
}
catch(OutOfMemoryException e)
{
...
}
catch(RandomErrorFromDatabaseLayer e)
{
...
}
}
我希望能够模拟这种方法中的任何类型的异常,并且应该被捕获
在这件事上有什么图书馆可以帮助我吗?
编辑1:在完成我对莫的要求方面有什么帮助吗?
您需要创建一个mock对象来代替可以抛出这些异常的真实对象。然后你可以创建简单的测试,就像这样:
public void ExampleMethod()
{
throw new OutOfMemoryException();
}
如果您使用的是依赖项注入框架,那么用模拟代码替换真实代码会更加容易。
您需要的是stub-一个将模拟代码某些条件的对象。出于测试目的,您通常使用存根(或其他类型的伪造对象)来替换真实对象实现。在您的情况下,请考虑:
public class MyClass
{
private IDataProvider dataProvider;
public void MyMethod()
{
try
{
this.dataProvider.GetData();
}
catch (OutOfMemoryException)
{
}
}
}
现在,您正在测试的类应该在某种级别上是可配置的,这样您就可以在测试时用存根/伪造的实现轻松地替换真正的DataProvider
实现(就像您所说的,您不想破坏您的DB,没有人想要!)。例如,这可以通过构造函数注入(或者实际上,任何其他依赖注入技术)来实现。
然后,您的测试是琐碎的(当抛出异常时,一些虚构的测试要求):
[Test]
public void MyMethod_DataProviderThrowsOutOfMemoryException_LogsError()
{
var dataProviderMock = new Mock<IDataProvider>();
dataProviderMock
.Setup(dp => dp.GetData())
.Throws<OutOfMemoryException>();
var myClass = new MyClass(dataProviderMock);
myClass.MyMethod();
// assert whatever needs to be checked
}