我在一个项目中使用的是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。
答案 0 :(得分:1)
两个选项:
Simmy是一个提供用于注入故障的Polly策略的项目。
例如,您可以定义:
var faultPolicy = MonkeyPolicy.InjectFault(new FooException());
(以及许多其他更强大的变体)。
但是,这仅与Polly v7 +兼容。
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包含更多示例,并提供了代码示例。