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