标签: chai-http

chai-http在运行测试后没有退出

我遇到了一个问题,在使用chai-http运行后我的mocha测试没有完成.测试后Mocha会挂起并最终进入超时状态(至少在我的CI上).

mocha.js chai chai-http

11
推荐指数
1
解决办法
4657
查看次数

使用 chai-http 设置接受的 CA 列表并忽略 SSL 错误

我正在尝试使用 chai/chai-http 为我的节点代码编写单元测试。一切正常,直到我将服务器切换到 HTTPS 服务器,但由于我的证书是由内部公司根签名的,并且我使用的证书的通用名称与 localhost 不匹配,因此 chai 在我的请求中抛出错误.

我想做以下事情:

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

  2. 设置要检查的 CA 列表。如果这不能完成,我可以跳过所有客户端证书检查。

我的代码如下:

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 …
Run Code Online (Sandbox Code Playgroud)

ssl node.js chai chai-http

7
推荐指数
1
解决办法
2146
查看次数

如何使用 mocha 和 chai 在测试之间正确关闭快速服务器

我正在寻找一种正确的方法来在测试之间完全重置我的快递服务器!似乎这不仅仅是我的问题,许多其他用户也提出了同样的问题,并且已经写了很多关于争论的博文。提出的解决方案对我来说既不奏效也不令人满意。这里有另一个类似的问题和一篇文章,很好地描述了问题并提出了一些解决方案:

堆栈溢出 运行 jasmine 规范后关闭快速服务器

博客:https : //glebbahmutov.com/blog/how-to-correctly-unit-test-express-server/

这里专门创建了一个包来解决这个问题:https : //www.npmjs.com/package/server-destroy

现在,一个最小的工作示例来重现我的情况。在被测代码中,创建了一个 express 服务器;当在某个端点上调用时,服务器增加一个值并返回它:

( function() {
   'use strict'

   const enableDestroy = require( 'server-destroy' )
   const app = require( 'express' )()
   const http = require( 'http' )

   let val = 0

   app.use( '/inc', (req, res) => {
      val ++
      res.send(val.toString())
   } )

   const server = http.createServer( app )

   server.listen( 3000 )

   enableDestroy(server);

   module.exports = server

} )()
Run Code Online (Sandbox Code Playgroud)

测试包含两个相同的测试用例;他们都在端点上调用服务器,并检查返回值。 before_eachafter_each部分是为了确保在运行单个测试用例之前创建新连接,然后关闭,以确保两个测试用例之间的独立性:

const chai = require( 'chai' ) …
Run Code Online (Sandbox Code Playgroud)

mocha.js node.js express chai chai-http

6
推荐指数
1
解决办法
9727
查看次数

测试GraphQL API

我正在测试我的GraphQL API,但我想稍微清理一下.值得注意的是我正在使用chai-http网络请求.这是我目前正在做的事情(哪个有效):

let createUser = (()=> {
  return new Promise((resolve, reject) => {
    chai.request(server)
      .post('/api/graphql/')
      .set('content-type', 'application/json')
      .send({ 'query' : 
        'mutation users { \
          user : addUser(inputs: { \
            firstName: \"Test\", \
            lastName: \"User\", \
            email: \"test@test.com\", \
          }) { \
            id, \
            firstName \
          } \
        }'
      })
      .end((err, res) => {
        if (err) { reject(err) }
        let data = res.body.data;
        let user = data.user;
        resolve(user);
      })
  });
});
Run Code Online (Sandbox Code Playgroud)

但是,我想稍微清理它并执行以下操作:

let createUser = (() => {
  let …
Run Code Online (Sandbox Code Playgroud)

mocha.js node.js chai graphql chai-http

5
推荐指数
1
解决办法
1548
查看次数

如何在 Axios 中使用客户端证书进行 HTTPS GET

如何使用 chai-http 使用如下所示的客户端证书执行获取请求?

curl -k --key [key_path] --cert [cert-path]:secret 'https://127.0.0.1/url'
Run Code Online (Sandbox Code Playgroud)

以下代码返回错误:

错误:错误:0906A068:PEM 例程:PEM_do_header:密码读取错误

我想这是因为缺少密码参数。

let chai = require('chai');
let chaiHttp = require('chai-http');

let should = chai.should();
var expect = chai.expect;

chai.use(chaiHttp);

// load certificates
let fs = require('fs')
let key = fs.readFileSync(__dirname + '/user.key')
let cert = fs.readFileSync(__dirname + '/user.crt')

describe('client certificate call', () => {
    it('should return data', () => {
        chai.request('https://127.0.0.1')
        .get('/url')
        .key(key)
        .cert(cert, 'secret')
        // .passphrase('secret')
        .end((err, res) => {
                res.should.have.status(200);
                done();
            });
        });

})
Run Code Online (Sandbox Code Playgroud)

使用 axios …

client-certificates node.js chai axios chai-http

5
推荐指数
0
解决办法
6913
查看次数

剔除中间件

我正在尝试使用 Sinon 在快速路由中删除一些自定义中间件,但它没有按我预期的那样工作。我希望它不会记录“我正在验证...”,而是将“存根”记录到控制台。看起来 sinon 没有正确地剔除中间件。

测试/test.js

const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
chai.use(chaiHttp);
const should = chai.should();
const auth = require('../auth');

const app = require('../app')

describe('My routes', function() {
    let checkTokenStub;
    beforeEach(()=>{
        checkTokenStub = sinon.stub(auth,'checkToken').callsFake(()=>{
            console.log('Stubbed');
        });;
    })
     it('returns hello', function(done) {
            chai.request(app)
                .get('/')
                .set('X-Auth-Token', 'xyz123')
                .end((err,res)=>{
                    res.text.should.be.eql('Hello')

                    done(err)
                })
        });
    });
Run Code Online (Sandbox Code Playgroud)

应用程序.js

var express = require('express'),
    app = express();
var router = express.Router();
app.use('/', require('./router'));

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

认证.js

exports.checkToken = function(req, res, …
Run Code Online (Sandbox Code Playgroud)

node.js sinon chai chai-http

5
推荐指数
1
解决办法
1101
查看次数

如何使用 Chai 和 Mocha 测试嵌套对象?

我正在使用 mocha、chai 和 chai-http 为我的 Node.js 和 Express 应用程序进行集成测试。我正在尝试测试我的登录路由是否有令牌。我尝试了不同的断言来检查数据对象内部是否存在令牌,但它们都不起作用。

来自 Postman 的数据如下所示:

{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NiwiaWF0IjoxNTYzODczMzE3LCJleHAiOjE1NjM5NTk3MTd9.bM1RFem2pnlEqjTWGhg-s4Am1PjGNRUS_8x5Dq8J6lI",
    "user": {
      "id": 6,
      "firstName": "John",
      "lastName": "Doe",
      "email": "test@test.com",
      "createdAt": "2019-07-23T06:38:11.358Z",
      "updatedAt": "2019-07-23T06:38:11.358Z"
    }
  },
  "hasErrors": false,
  "errors": []
}
Run Code Online (Sandbox Code Playgroud)

这是我的实际测试,我试图检查 res.body 是否在数据对象内嵌套了令牌。

/* Login Test */
let credentials = {
  'email': 'adnan@test.com',
  'password': 'test'
};

describe("POST /user-sessions", function() {
  it("should login user", function(done) {
    chai.request('http://localhost:3000')
      .post("/user-sessions")
      .send(credentials) 
      .end((err, res) => {
        res.should.have.status(200);

        res.body.should.have.nested.property('data.token');
        done();
      })
  });
})
Run Code Online (Sandbox Code Playgroud)

我收到 Uncaught AssertionError: Expected …

mocha.js chai chai-http

3
推荐指数
1
解决办法
4744
查看次数

Chai 无法识别内容类型“application/javascript”

无论我的服务器实际返回什么,Chai 总是会告诉我res.body={}内容类型是否为“application/javascript”。

这是我的服务器:

const http = require('http');
const server = http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "application/javascript"});
    response.end('console.log("test");');
});

module.exports = server;

server.listen(process.env.PORT || 8000);
console.log("Server running at http://localhost:8000/");
Run Code Online (Sandbox Code Playgroud)

它输出console.log("test");在此输入图像描述

但测试没有看到它:

const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('./test-server');
const should = chai.should();    
chai.use(chaiHttp);

describe('GET /test', () => {
  it('it should give test result', (done) => {
    chai.request(server)
        .get('/test')
        .end((err, res) => {
            console.log(err);
            console.log(res);
            console.log(res.body); // {}
            console.log(res.text); // undefined
            res.body.should.be.eql('console.log("test");'); …
Run Code Online (Sandbox Code Playgroud)

javascript mocha.js node.js chai chai-http

2
推荐指数
1
解决办法
1486
查看次数

柴http - 双回调问题

我使用chai-http对我的REST api进行了正常的单元测试.它失败并出现以下错误

warn: double callback!
error: { SyntaxError: Unexpected token { in JSON at position 58
    at Object.parse (native)
    at IncomingMessage.<anonymous> (E:\projects\node_modules\chai-http\node_modules\superagent\lib\node\parsers\json.js:8:35)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)
  rawResponse: '{"books":[],"count":0,"page":1,"pages":0,"pageSize":10}{"books":[],"count":0,"page":1,"pages":0,"pageSize":10}',
  statusCode: 200,
  response: undefined }
Run Code Online (Sandbox Code Playgroud)

如您所见,rawResponse由于测试失败,重复.我调试了代码,控制器代码只调用一次,输出正确.但无法理解为什么会出现这种错误.

以下是测试代码

// some code to mock mongoose with mockgoose
....
....

let server = require('../../../server');
let should = chai.should();
chai.use(chaiHttp);


describe.only('Books', () => {
  describe('/GET book', () => {
      it('it should GET all …
Run Code Online (Sandbox Code Playgroud)

mocha.js node.js chai mockgoose chai-http

2
推荐指数
1
解决办法
2444
查看次数

Mocha Chai 检查 Json 响应是否包含特定属性

我正在创建 API 测试,它检查响应是否包含结构中的特定键“textId”:

  it('TC-4 /rest/passwords/ should change "password"', function() {
    return chai.request(serverurl)
      .post('/rest/passwords/')
      .set('Content-Type', 'application/json')
      .set('Accept', 'text/html')
      .set('X-Api-Key', global.apikey)
      .set('Cookie', global.cookie)
      .send({password: "password"})
      .then(function(res) {
        res.should.have.status(200);
        res.should.be.json;
        console.log('TC-4 /rest/passwords/: %j\n', res.body);
        res.body.should.have.all.keys(['textId']);
      });
  });
Run Code Online (Sandbox Code Playgroud)

回应如下:

[{"textId":"PasswordNeedsAtLeastOneDigit","parameters":{}},{"textId":"PasswordNeedsAtLeastOneUpperCaseCharacter","parameters":{}}]
Run Code Online (Sandbox Code Playgroud)

我试过:

res.body.should.have.property('textId');
res.body.should.have.nested.property('textId');
res.body.should.have.all.keys(['textId']);
res.body.should.have.all.nested.keys(['textId']);
Run Code Online (Sandbox Code Playgroud)

他们都没有工作

mocha.js jsonpath chai chai-http

2
推荐指数
1
解决办法
2158
查看次数