我收到错误“预期400等于200”

时间:2016-11-14 11:55:52

标签: jasmine-node frisby.js

我使用Frisby框架编写API测试用例。当我将网址和凭证放入邮递员或DHC时,响应正确,但在frisby测试用例中我收到错误: -

代码如下: -

var frisby = require('frisby');
frisby.create('User Authentication')

//send the params to below url
   .post("url",
      { username: "username",
        password: "password"
      },
      { json: true,
        headers: {Accept:'application/json',
                 'Accept-Encoding':'Encoding:gzip, deflate',
                 'Accept-Language':'en-US,en;q=0.8',
                 Connection:'keep-alive',
                 'Content-Length':'107',
                 'Content-Type':'application/json',
                 Host:'url.com',
                 Origin:'http://url.com',
                 Referer:'http://url.com/',
                 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
                 'X-Application-Key':'1234545',
                 'X-Requested-With':'XMLHttpRequest'
                 }
       }
    )

.expectStatus(200)
.toss(); 

1 个答案:

答案 0 :(得分:0)

请求以400的形式返回,这是一个HTTP Bad Request

我首先要呕吐API发回给你的响应消息正文,以查看错误的任何细节。错误的请求响应往往会告诉您该请求有什么问题。

由于frisby是异步的,因此您可以使用after()(在投掷之前)确保执行顺序。

.post("https://blah.blah.blah.com", "some json...", "some more json...")
.expectStatus(200)
.after(function(err, res, body){ console.log(body); })
.toss(); 

现在,弗里斯比的post()有3个参数:

  • url:网址
  • data:您的帖子请求的正文
  • params:frisby post功能帖子的参数,比如告诉它提交json。

所以它看起来你正在发布(可能是创建)用户名/密码对象。

我假设字符串"url"确实是一些有效的网址,因此我们可以跳过这个明显的问题。

在没有看到任何错误消息的情况下进行疯狂拍摄,我猜你的问题是你没有向API提供身份验证凭据。我不知道很多API完全开放。通常情况下,您希望使用Basic Auth凭证,如果您不提供这些凭据,您通常会获得:

  • 400 bad request如果他们对一条消息说"没有凭据"
  • 很好
  • 404 not found如果他们玩腼腆并且不希望非授权人员知道那里有有效的资源
  • 或者甚至是403 Forbidden

如果它确实是凭据,则在创建和发布帖子之后,但在toss()之前添加它们。如果你把它放在post()之前它会失败。此外,这是API用户名&密码,而不是您尝试在系统中创建的任何用户。有时他们会在API&{39} client_idclient_secretAPI_KEYAPI_SECRET中引用它们,但它只是一个标识符和共享秘密。

所以最后的事情看起来像是

.post("https://blah.blah.blah.com", "some json...", "some more json...")

.auth("api_username", "api_password")

.expectStatus(200)

.toss(); 

Frisby会将明文用户名/密码转换为有效的base 64编码字符串,并将其粘贴在Authorization:标题中(可能是为什么在调用post()之后需要发生这种情况)

另外,我喜欢使用addHeader(header, content)显式添加标题,而不是在post()中删除一个讨厌的json blob,但这只是我的偏好。

祝你好运!