FluentAssertions for equality of objects graph with array -



我正在为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,它有一些关于比较对象图的相当不错的文档,但我似乎无法正确配置。

这是我的代码:

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以内。我做错了什么?

您需要将Using<double>()WhenTypeIs<double>()配对。

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-比较行为

最新更新