首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chakram请求返回的未定义响应

Chakram请求返回的未定义响应
EN

Stack Overflow用户
提问于 2018-03-19 13:06:58
回答 2查看 992关注 0票数 1

在用量角器编写的自动化测试中,我遇到了一个奇怪的问题。我们需要测试一组通过HTTP返回JSON的API端点,而不是实际的网站,所以我的团队决定使用查克拉姆,而不是依赖Protractor。

我有一个页面对象负责访问API:

代码语言:javascript
复制
const qs = require('querystring')
const chakram = require('chakram');

function MyApi() {

  const domain = // read from a configuration file

  this.readImportantBusinessData = (queryParams) => {
    const serviceUrl = `${domain}/services/seriousBusiness.json`;
    const queryString = qs.stringify(queryParams);
    const fullUrl = `${serviceUrl}?${queryString}`;
    return chakram.get(fullUrl).then((response) => {
      return response;
    });
  };
};

module.exports = new MyApi();

然后,在我的一个规范中,我调用readImportantBusinessData函数来检查它是否返回预期的数据。

代码语言:javascript
复制
return MyApi.readImportantBusinessData(validParameters).then((response) => {
        chakramExpect(response).to.have.status(HTTP_200_OK);
        chakramExpect(response).to.have.json({
            "foo" : "bar"
        });
      });

根据我运行此代码的环境而定,测试通过或失败时会出现错误消息,这意味着没有收到任何响应。

代码语言:javascript
复制
Failed: Cannot read property 'statusCode' of undefined

我可以确认我击中的服务器正在运行,并且在使用web浏览器时我可以得到正确的响应。

当我使用托管在AWS中的共享服务器时,在我的测试中所做的请求成功,而当我使用运行在VirtualBox中的本地服务器时,则失败。

为什么查克拉姆根本得不到回应呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-19 13:06:58

根本原因

expect的调用只显示了undefined,但我成功地记录了整个响应对象,就像chakram.get返回的那样

代码语言:javascript
复制
{ error: { Error: self signed certificate
  at TLSSocket.<anonymous> (_tls_wrap.js:1103:38)
  at emitNone (events.js:106:13)
  at TLSSocket.emit (events.js:208:7)
  at TLSSocket.finishInit (_tls_wrap.js:637:8)
  at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:467:38) code: 'DEPTH_ZERO_SELF_SIGNED_CERT' },
  response: undefined,
  body: undefined,
  jar:
       RequestJar {
         jar: CookieJar { enableLooseMode: true, store: { idx: {} } } 
       },
  url: 'https://www.example.com/myService.json?foo=bar',
  responseTime: 29.524212 
}

这意味着Chakram与我在本地dev环境中使用的自签名证书有问题。其他服务器托管在云中,并正确设置它们的证书。

解决办法

Google快速搜索返回了许多修改全局参数的建议,该参数通过设置:

代码语言:javascript
复制
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

但是,这影响到整个节点进程,而不仅仅是我的测试。这些只是我在本地运行的测试,与实际的用户数据无关。不过,如果我要使这些电话的安全性更加松懈,我需要这样做来尽可能地限制这种变化的范围。

值得庆幸的是,chakram.get使用了请求库,这使得大量定制请求成为可能。

chakram.get允许我通过:

params对象可选的附加请求选项,请参阅流行的请求库选项。

这些选项反过来允许我指定:

agentOptions -并传递它的选项。注意:有关HTTPS,请参阅用于TLS/SSL选项的tls API文档和上面的文档。

最后,在agentOptions中,可以传递一个rejectUnauthorized值,该值允许在发出单个请求时忽略证书错误。

因此,在我的页面对象中,我可以使用:

代码语言:javascript
复制
return chakram.get(fullUrl, {
  agentOptions : {
    //Hack to allow requests to the local env with a self-signed cert
    rejectUnauthorized : false
  }
}).then((response) => {
  return response;
});

这允许测试成功,尽管使用的是自签名证书。

解决方案

解决方案是为每个环境和域提供一个有效的证书,在这种情况下,问题首先不存在。

票数 1
EN

Stack Overflow用户

发布于 2018-03-25 09:56:28

这是因为它的异步和ur函数在执行时甚至没有完成chakram请求。等待请求完成才能得到响应。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49363762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档