使用chai-http

时间:2017-01-10 15:43:01

标签: node.js ssl chai chai-http

我试图用chai / chai-http为我的节点代码编写单元测试。一切都工作正常,直到我将服务器切换到HTTPS服务器,但因为我的证书是由内部公司根签名的,而且我使用的证书的通用名称与本地主机不匹配,所以chai正在抛出一个我的请求错误。

我想做以下事情:

  1. 忽略与域名验证相关的SSL错误。

  2. 设置要检查的CA列表。如果无法做到这一点,我可以改用所有客户端证书检查。

  3. 我的代码如下:

    var chai = require('chai');
    var chaiHttp = require('chai-http');
    var https = require('https');
    var fs = require('fs');
    var server = require('../app.js');
    
    chai.should();
    chai.use(chaiHttp);
    
    https.globalAgent.options.ca = [
        fs.readFileSync('./ssl/Root.cer'),
    ];
    
    describe('Attachments', function () {
      it('should succeed when passed valid arguments', function (done) {
          chai.request(server)
            .get('/10881057300D0A4E8E8586542AA3626E41')
            .set('userId', 'user')
            .set('region', 'US')
            .end(function (err, res) {
                chai.assert(res);
                res.should.have.status(200);
                chai.assert(res.body);
                done();
            });
      });
    
      it('should return error without userId header', function (done) {
          chai.request(server)
            .get('/10881057300D0A4E8E8586542AA3626E41')
            .end(function (err, res) {
                chai.assert(res);
                res.should.have.status(500);
                chai.assert(res.type == 'application/json');
                done();
            });
      });
    });
    

    我得到以下堆栈跟踪:

     Uncaught AssertionError: Unspecified AssertionError
      at test\test.js:21:18
      at Test.Request.callback (node_modules\superagent\lib\node\index.js:615:12
    )
      at ClientRequest.<anonymous> (node_modules\superagent\lib\node\index.js:56
    7:10)
      at TLSSocket.socketErrorListener (_http_client.js:267:9)
      at emitErrorNT (net.js:1253:8)
    

1 个答案:

答案 0 :(得分:2)

我通过建议here解决了这个问题。

我认为它拒绝作为无效的TLS。即使我没有使用无效的证书,我还是假设某个地方正在将有效证书的url更改为localhost或解析为与我所支持的证书的FQDN无关的IP地址。使用。在第一个&#34; describe()&#34;之前添加以下代码为我修好了。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

以下是完整的测试代码:

var chai = require('chai');
var chaiHttp = require('chai-http');
var server = require('../server');
var should = chai.should();

chai.use(chaiHttp);

// This line allows use with https
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

describe('Auth', function() {
    it('should return 401 with invalid credentials', function(done){
        chai.request(server)
        .post('/api/v1/user/authenticate')
        .send({"email":"badaccount@somedomain.com", "password": "password"})
        .end(function(err, res) {
            res.should.have.status(401);
            done();
        });
    });


});