如何模拟在单元测试中抛出异常

本文关键字:单元测试 抛出异常 模拟 何模拟 | 更新日期: 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
}