在过去的两周里,我一直在研究GODOG,一种像blang一样的黄瓜,用于golang。我发现它非常有趣,最近我花了更多的时间为我的REST API编写测试。最近,我不断地试图通过我的一项测试。这个包含一个JSON结构,其内部有jilden JSON。此外,我正在按照以下链接中的确切示例进行测试:
https://github.com/DATA-DOG/godog/tree/master/examples/api
我有一个结构:
type Status struct {
ErrorCode string `json:"ERROR_CODE"`
ErrorText string `json:"ERROR_TEXT"`
}
type OutputResponse1 struct {
Status Status `json:"STATUS"`
}
type OutputResponse2 struct {
Status Status `json:"STATUS"`
Config json.RawMessage `json:"CONFIG"`
}
字节类型变量:
var responseByte []byte
两种不同的输出响应:
//--------------1
responseByte, _ = json.Marshal(OutputResponse1{
Status: Status{
ErrorCode: "-2",
ErrorText: "Config was not found",
},
})
//------------2
responseByte, _ = json.Marshal(&OutputResponseSuccess{
Status: Status{
ErrorCode: "0",
ErrorText: " ",},
Config: json.RawMessage(body),
})
json.Rawmessage
来自另一个来源,如:
{
"binaryVersion":"1.0.0",
"configVersion":"1.1.1"
}
现在在功能文件中我测试了类似的东西:
//--------------1
And the response should match json:
{
"STATUS": {
"ERROR_CODE": "-2",
"ERROR_TEXT": "Config was not found"
}
}
此测试通行证
第二个是json.RawMessage
响应应该与json匹配:
{
"STATUS": {
"ERROR_CODE":"0",
"ERROR_TEXT":" "
},
"CONFIG":{
"binaryVersion":"1.0.0",
"configVersion":"1.1.1"
}
}
现在这一次失败,即使GODG输出有实际意义并且预期相同
------------------------Acutal output of godog test---------------------------
And the response should match json:
{"STATUS":{"ERROR_CODE":"0","ERROR_TEXT":" "},"CONFIG": {"binaryVersion":"1.0.0","configVersion":"1.1.1"}}
Expected json does not match actual:
{"STATUS":{"ERROR_CODE":"0","ERROR_TEXT":" "},"CONFIG": {"binaryVersion":"1.0.0","configVersion":"1.1.1"}}
--- Failed scenarios:
来自godog的人也建议我摆脱领先和尾随的空白,所以我甚至做了
bytes.TrimSpace(responseByte)
仍然没有运气。
任何人都面临同样的问题?
答案 0 :(得分:1)
不确定这是否会解决您的问题,但如果您使用的是Go1.7或更低版本,请尝试使用*json.RawMessage
作为Config
字段的类型。因为Go的pre 1.8 json.RawMessage
在指针接收器上定义了MarshaJSON
方法,而不是值接收器导致json.RawMessage
值在base64中被编码为字符串字节。
type OutputResponse2 struct {
Status Status `json:"STATUS"`
Config *json.RawMessage `json:"CONFIG"`
}
raw := json.RawMessage(body)
responseByte, err := json.Marshal(&OutputResponseSuccess{
Status: Status{
ErrorCode: "0",
ErrorText: " ",
},
Config: &raw,
})
if err != nil {
// ...
}
答案 1 :(得分:1)
我是 godog 的作者。目前在您链接的示例中,它逐个比较字节,并将实际结果打印到匹配的最后一个字节。
现在关于 json.Marshal 。当它将地图编组到json时,它sorts map keys并且如果我们重新编码预期和实际的json响应,那么我们可以确定它是否应该生成相同的字节切片,如果它匹配,无论如何您放置预期对象键的顺序。