我正在使用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()每次都抛出异常,否则重试循环永远不会成功。
我可以在这做什么?
答案 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
块中访问它们(而不仅仅是使用计数器)。