Polly策略在调用Execute()时引发异常

时间:2019-12-11 14:50:11

标签: c# polly

我在一个项目中使用的是Polly-5.9的过时版本。

对于一个测试用例,我试图创建一个在调用Execute()时总是抛出异常的策略。该策略将在测试时注入到实际代码中,并且期望它会失败。

我可以做类似的事情:

Policy somePolicy = Policy.Handle<Exception>().Retry();
somePolicy.Execute((cToken) => { throw new Exception(); }, new Context("A context"), cancellationToken); 

但是,我无法访问或控制Execute()的第一个参数,即(cToken) => { throw new Exception(); }部分。

我还尝试了使用HandleResult()的变通方法,如下所示:

Policy<bool> somePolicy = Policy.HandleResult<bool>((o) => { throw new Exception(); }).Retry();

这是有效的,但是Policy<bool>使得与仅使用Policy的其余代码进行集成非常麻烦。

该策略本身并不重要,只要它在Execute()的任何调用上引发异常。 有一种干净的方法可以实现这一目标吗?

PS:目前无法升级Polly。

1 个答案:

答案 0 :(得分:1)

两个选项:

1使用Simmy

Simmy是一个提供用于注入故障的Polly策略的项目。

例如,您可以定义:

var faultPolicy = MonkeyPolicy.InjectFault(new FooException());

(以及许多其他更强大的变体)。

但是,这仅与Polly v7 +兼容。

2使用策略界面和模拟策略

Polly对所有fulfil execution interfaces进行政策管理。根据政策:

  • ISyncPolicy
  • ISyncPolicy<TResult>
  • IAsyncPolicy
  • IAsyncPolicy<TResult>

这些接口定义了策略上可用的.Execute/Async()重载。

有了这些,您可以使用标准的依赖注入和模拟技术来构建测试:

  • 在生产代码中,按执行接口类型声明和使用策略。
  • 确保将ISyncPolicy或类似的东西(或PolicyRegistry)注入被测系统中,而不是在被测系统中创建,以便测试可以替代模拟。
  • 在单元测试中,请传递Mock<ISyncPolicy>。然后,您可以使用Moq等任何模拟工具来通过策略模拟.Execute()调用以引发异常。

例如:

ISyncPolicy mockPolicy = new Mock<ISyncPolicy>();
mockPolicy.Setup(p => p.Execute(It.IsAny<Func<Bar>>())
    .Throws(new FooException());

Polly wiki on unit-testing包含更多示例,并提供了代码示例。