Fluent Assertion 中的对象结构比较方法
Object structure comparison methods in Fluent Assertion
我注意到最新的 nuget 包(FluentAssertions -Version 5.6.0)我仍然看不到 ShouldBeEquivalentTo
方法来进行没有价值的对象比较(仅结构)。我可以看到 Should().BeEquivalentTo()
但不确定如何断言除值之外的对象结构。
我的解决方案是.Net Core 2.1
我的代码:
[Fact]
public void GetFlatTariffForOneProduct_ReturnSuccess()
{
this.Given(_ => _steps.GivenACorrelationIdHeaderIsProvided(true))
.And(_ => _steps.TheFlatTariffRawDataInDb(1))
.When(_ => _steps.WhenTheRequestExecutes(_endpoint, new EstimationRequestBuilder().FlatRateElecRequest().Build()))
.Then(_ => _steps.TheResponseCodeIs(HttpStatusCode.OK))
.And(_ => _steps.TheReturnedContentIs(new EstimationResponseBuilder().EstimateResponse(1).Build()))
.BDDfy();
}
上面的最后一步调用下面的方法来断言没有数据的对象模型。
public async Task TheReturnedContentIs<T>(T obj)
{
var responseString = await ResponseMessage.Content.ReadAsStringAsync();
var deserializeObject = JsonConvert.DeserializeObject<T>(responseString);
obj.Should().BeEquivalentTo(deserializeObject);
}
预期响应:
{
"attributeA": {
"attribute2": "CITIPP",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 65.5022916666667,
"attribute7": 45.407291666666673,
"attribute8": 33.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 21.8762916666667,
"attribute7": 89.432291666666673,
"attribute8": 90.236791666666679
}
}
]
},
"attributeB": {
"attribute2": "CITIPP",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 71.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 62.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 38.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 44.3684791666666679
}
}
]
}
}
根据下面的断言,实际响应应该会通过。正如您所注意到的,结构与值相同。但是,如果任何 attribute
名称不同,则断言应该失败。 (例如,如果 attributeA
在响应中更改为 attributeX
)
实际响应
{
"attributeA": {
"attribute2": "ABCD",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 71.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 62.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 71.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 62.454791666666679
}
}
]
},
"attributeB": {
"attribute2": "CITIPP",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 54.5022916666667,
"attribute7": 11.407291666666673,
"attribute8": 98.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 71.222916666667,
"attribute7": 53.33291666666673,
"attribute8": 32.454791666666679
}
}
]
}
}
我将对象模型传递给上面的方法。所以我希望比较没有值的对象结构。由于值差异导致上述断言失败的原因。结构完美匹配
您可以像 BeEquivalentTo
通常那样遍历两个对象图,但通过将任意两个实例视为相等来忽略所有字符串和数字类型。
这是一个应该这样做的例子。
T expected = JsonConvert.DeserializeObject<T>(expectedJSON);
T actual = JsonConvert.DeserializeObject<T>(actualJSON);
actual.Should().BeEquivalentTo(expected, opt => opt
.Using<object>(_ => { })
.When(e => e.RuntimeType.IsValueType)
.Using<string>(_ => { })
.WhenTypeIs<string>())
在文档中阅读更多内容:https://fluentassertions.com/objectgraphs/#equivalency-comparison-behavior
我注意到最新的 nuget 包(FluentAssertions -Version 5.6.0)我仍然看不到 ShouldBeEquivalentTo
方法来进行没有价值的对象比较(仅结构)。我可以看到 Should().BeEquivalentTo()
但不确定如何断言除值之外的对象结构。
我的解决方案是.Net Core 2.1
我的代码:
[Fact]
public void GetFlatTariffForOneProduct_ReturnSuccess()
{
this.Given(_ => _steps.GivenACorrelationIdHeaderIsProvided(true))
.And(_ => _steps.TheFlatTariffRawDataInDb(1))
.When(_ => _steps.WhenTheRequestExecutes(_endpoint, new EstimationRequestBuilder().FlatRateElecRequest().Build()))
.Then(_ => _steps.TheResponseCodeIs(HttpStatusCode.OK))
.And(_ => _steps.TheReturnedContentIs(new EstimationResponseBuilder().EstimateResponse(1).Build()))
.BDDfy();
}
上面的最后一步调用下面的方法来断言没有数据的对象模型。
public async Task TheReturnedContentIs<T>(T obj)
{
var responseString = await ResponseMessage.Content.ReadAsStringAsync();
var deserializeObject = JsonConvert.DeserializeObject<T>(responseString);
obj.Should().BeEquivalentTo(deserializeObject);
}
预期响应:
{
"attributeA": {
"attribute2": "CITIPP",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 65.5022916666667,
"attribute7": 45.407291666666673,
"attribute8": 33.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 21.8762916666667,
"attribute7": 89.432291666666673,
"attribute8": 90.236791666666679
}
}
]
},
"attributeB": {
"attribute2": "CITIPP",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 71.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 62.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 38.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 44.3684791666666679
}
}
]
}
}
根据下面的断言,实际响应应该会通过。正如您所注意到的,结构与值相同。但是,如果任何 attribute
名称不同,则断言应该失败。 (例如,如果 attributeA
在响应中更改为 attributeX
)
实际响应
{
"attributeA": {
"attribute2": "ABCD",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 71.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 62.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 71.5022916666667,
"attribute7": 53.407291666666673,
"attribute8": 62.454791666666679
}
}
]
},
"attributeB": {
"attribute2": "CITIPP",
"attribute3": [
{
"attribute4": "Variable",
"attribute5": {
"attribute6": 54.5022916666667,
"attribute7": 11.407291666666673,
"attribute8": 98.454791666666679
}
},
{
"attribute4": "Fixed",
"attribute5": {
"attribute6": 71.222916666667,
"attribute7": 53.33291666666673,
"attribute8": 32.454791666666679
}
}
]
}
}
我将对象模型传递给上面的方法。所以我希望比较没有值的对象结构。由于值差异导致上述断言失败的原因。结构完美匹配
您可以像 BeEquivalentTo
通常那样遍历两个对象图,但通过将任意两个实例视为相等来忽略所有字符串和数字类型。
这是一个应该这样做的例子。
T expected = JsonConvert.DeserializeObject<T>(expectedJSON);
T actual = JsonConvert.DeserializeObject<T>(actualJSON);
actual.Should().BeEquivalentTo(expected, opt => opt
.Using<object>(_ => { })
.When(e => e.RuntimeType.IsValueType)
.Using<string>(_ => { })
.WhenTypeIs<string>())
在文档中阅读更多内容:https://fluentassertions.com/objectgraphs/#equivalency-comparison-behavior