【问题标题】:Polly policy to throw an exception when Execute() is calledPolly 策略在调用 Execute() 时抛出异常
【发布时间】:2019-12-12 03:14:38
【问题描述】:

我在我的一个项目中使用了稍微过时的 Polly 版本 - 5.9

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

我可以这样做:

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

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

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

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

这是可行的,但是,Policy&lt;bool&gt; 使得与仅使用 Policy 的其余代码集成变得很麻烦。

策略本身无关紧要,只要它在任何Execute() 调用中引发异常即可。 有没有一种干净的方法来实现这一点?

PS:目前无法升级 Polly。

【问题讨论】:

    标签: c# polly


    【解决方案1】:

    两种选择:

    1 使用Simmy

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

    例如,您可以定义:

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

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

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

    2 使用策略接口和模拟策略

    Polly 策略全部为fulfil execution interfaces。取决于政策:

    • ISyncPolicy
    • ISyncPolicy&lt;TResult&gt;
    • IAsyncPolicy
    • IAsyncPolicy&lt;TResult&gt;

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

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

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

    例如:

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

    Polly wiki on unit-testing 上更详细地介绍了这一点以及更多内容,并附有代码示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多