流利断言中的对象结构比较方法

时间:2019-02-26 04:22:51

标签: asp.net-core fluent-assertions

我注意到使用最新的nuget包(FluentAssertions-版本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
                }
            }
        ]
    }
}

我将对象模型传递给上述方法。所以我希望比较没有值的对象结构。由于值差异而导致上述断言失败的原因。结构完美匹配。

1 个答案:

答案 0 :(得分:2)

您可以做的是像通常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/documentation/#equivalency-comparison-behavior