NSubstitute条件用于抛出除参数之外的异常

时间:2015-02-02 06:44:19

标签: unit-testing exception nsubstitute

我正在使用NSubstitute来模拟我测试的方法使用的类。这个被模拟的类可能会在某些条件下抛出特定的异常。

我正在测试的方法有一些“重试”逻辑,它在捕获此异常时执行。我正在尝试测试这个重试逻辑。所以,我需要这个模拟类的特定方法有时抛出异常,但不是其他时候。不幸的是,抛出此异常的方法没有参数,所以我不能将throw逻辑基于参数。

如何使模拟对象的方法抛出异常:

A)......前N次被称为 或
B)......基于参数在其之前调用的其他方法 或
C)......在

传递的参数以外的任何其他条件下

为了让您更清楚地了解我正在尝试做什么,我的代码就像:

IDataSender myDataSender = GetDataSender();
int ID = GetNextAvailableID();
myDataSender.ClearData();
myDataSender.Add(ID,"DataToSend");
bool sendSuccess = false;
while (!sendSuccess)
{
   try
   {
      myDataSender.SendData();
      sendSuccess = true;
   }
   catch (IDCollisionException)
   {
      ID++;
      MyDataSender.ClearData();
      myDataSender.Add(ID,"DataToSend");
   }
}

所以,我需要测试我的重试逻辑,我需要模拟IDCollisionException。但是,我不能让SendData()每次都抛出异常,否则重试循环永远不会成功。

我可以在这做什么?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,您可以使用When..Do并关闭局部变量来获得此行为。

const int throwUntil = 3;
var callsToSendData = 0;
var dataSender = Substitute.For<IDataSender>();

dataSender
    .When(x => x.SendData())
    .Do(x =>
    {
        callsToSendData++;
        if (callsToSendData < throwUntil)
        {
            throw new DbCollisionException();
        }
    });

同样,您也可以使用callbacks本地捕获传递给其他方法的参数,并在Do块中访问它们(而不仅仅是使用计数器)。