【问题标题】:Golang Godog REST API Test failsGolang Godog REST API 测试失败
【发布时间】:2017-03-17 14:46:24
【问题描述】:

在过去的 2 周里,我一直在研究 GODOG,一个像 bdd 一样的黄瓜,用于 golang。我发现它非常有趣,最近我花了更多时间为我的 REST API 编写测试。最近,我一直未能通过我的一项测试。这个包括一个 JSON 结构,它内部有子 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"
      }
 }

现在这个失败了,即使上帝的输出与实际和预期相同

------------------------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)

还是没有运气。

有人遇到同样的问题吗?

【问题讨论】:

  • 从技术上讲,JSON 对象键是无序的,因此您根本不能依赖直接比较它们。
  • 实际的中间好像多了一个空格。我不认为 TrimSpace 对你有帮助
  • godog测试输出显示两个json字符串不同,实际输出中的"CONFIG": {"少了一个空格。这可能只是因为您格式化问题的方式,但如果 godog 正在比较字符串,您应该确保空格匹配。
  • @mkopriva 哦,对不起,当我复制粘贴是 stackoverflow 时,这只是我的拼写错误。实际上 config:{ 是正确的,根本没有空格。
  • @JimB 对不起,吉姆,我应该更具体一些。上面的链接有一个我用于测试的示例。它有忽略 kv 顺序的代码。所以基本上以下内容通过了我的一项测试:{“STATUS”:{“ERROR_TEXT”:“在数据存储中找不到错误配置”,“ERROR_CODE”:“-2”}}{“STATUS”:{“ERROR_CODE” :"-2","ERROR_TEXT":"在数据存储中找不到错误配置"}}

标签: json rest go cucumber


【解决方案1】:

不确定这是否能解决您的问题,但如果您使用的是 Go1.7 或更低版本,请尝试使用 *json.RawMessage 作为 Config 字段的类型。因为 Go 的 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 {
    // ...
}

【讨论】:

    【解决方案2】:

    我是godog的作者。目前在您链接的示例中,它逐个比较字节并将实际结果打印到它匹配的最后一个字节。

    现在关于 go 中的 json.Marshal。当它将映射编组为 json 时,它 sorts map keys 并考虑到如果我们重新编码预期和实际的 json 响应,那么我们可以确定如果匹配,它应该生成相同的字节片,无论在哪个您放置预期对象键的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多