【问题标题】:FluentAssertions for equality of objects graph with array - approximate equalityFluentAssertions 用于对象图与数组的相等性 - 近似相等
【发布时间】:2022-03-23 18:03:40
【问题描述】:

我正在尝试为 API 编写一组测试,它以以下形式返回结果

{
  "metrics": [
    {
      "key": "Metric1",
      "portfolios": [
        {
          "portfolioKey": "Portfolio1",
          "outputs": [
            1000000,
            1013785.999689,
            1040271.12363882
          ]
        }
      ]
    },
    {
      "key": "Metric2",
      "portfolios": [
        {
          "portfolioKey": "Portfolio1",
          "outputs": [
            1000000,
            986601.99318665,
            985925.470917517
          ]
        }
      ]
    }
  ]
}

如您所见,返回的对象有

  • 度量对象数组
  • 每个指标都有一个标识它的键
  • 每个指标都有一个列表,如果投资组合对于返回的每个指标都是相同的
  • 每个投资组合都有一个标识它的密钥
  • 指标中的每个投资组合都有一个名为 outputs 的双精度数组。

我正在尝试测试的正是这个嵌套的双精度数组,我需要比较给定指标/投资组合组合的输出。但是我只想测试近似平等。为了这个问题,可以说我希望预期结果与0.1内的实际结果相匹配

我正在使用 Fluent Assertions,它在比较对象图时有一些相当不错的documentation,但我似乎无法正确配置它。

这是我的代码:

expectedMetrics.Should().BeEquivalentTo(actualMetrics, options =>
{
    options.Using<Metric>(m =>
    {
        m.Subject.Should().BeEquivalentTo(m.Subject, mo =>
        {
            mo.WithMapping<Metric>(x => x.Key, x => x.Key);
            mo.Using<Portfolio>(p =>
            {
                p.Should().BeEquivalentTo(p.Subject, po =>
                {
                    po.WithMapping<Portfolio>(x => x.PortfolioKey, x => x.PortfolioKey);
                    po.WithStrictOrderingFor(x => x.Outputs);
                    po.Including(x => x.Outputs).Using<double>(x =>
                    {
                        x.Subject.Should().BeApproximately(x.Expectation, 0.1);
                    });
                    return po;
                }); 
            });
            return mo;
        });
    });
    options.WithTracing();
    return options;
});

这似乎既不使用我的映射,也不使用我的双打近似相等。追踪的一小段摘录说

Expected expectedMetrics.Metrics[0].Portfolios[0].Outputs[1] to be 1013785.9996890002, but found 1013785.999689.
Expected expectedMetrics.Metrics[0].Portfolios[0].Outputs[2] to be 1040271.1236388228, but found 1040271.12363882.

这显然没有检查到 0.1 以内。我究竟做错了什么?

【问题讨论】:

    标签: c# fluent-assertions


    【解决方案1】:

    您需要将Using&lt;double&gt;() 与WhenTypeIs&lt;double&gt;() 配对。

    var subject = new[] { 1013785.999689, 1040271.12363882 };
    var expected = new[] { 1013785.9996890002, 1040271.1236388228 };
    
    subject.Should().BeEquivalentTo(expected, opt => opt
        .Using<double>(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, 0.1))
        .WhenTypeIs<double>()
    );
    

    https://fluentassertions.com/objectgraphs/#equivalency-comparison-behavior

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 2012-03-11
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多