Golang Godog REST API测试失败

时间:2017-03-17 14:46:24

标签: json rest go cucumber

在过去的两周里,我一直在研究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)

仍然没有运气。

任何人都面临同样的问题?

2 个答案:

答案 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响应,那么我们可以确定它是否应该生成相同的字节切片,如果它匹配,无论如何您放置预期对象键的顺序。