在 mocha 测试中 500 等于 400 次通过?

500 equals 400 passes in a mocha test?

为什么下面的测试通过了?

"use strict";

const
    path = require('path'),
    Dexter = require('../src/Dexter.js'),
    chai = require('chai'),
    chaiHttp = require('chai-http'),
    expect = chai.expect,
    dexterServer = new Dexter(path.resolve(__dirname, 'test/data/sample.har'));

chai.use(chaiHttp);
describe('Rest API', () => {
    before(() => {
        dexterServer.startUp();
    });

    it('should\'ve started the server', function () {
        chai.request('http://127.0.0.1:1121')
            .get('/')
            .end(function(err, response){
                console.log(response.status);
                expect(500).to.equal(400);// This passes? What?
                done();
            });
    });

    after(() => {
        dexterServer.tearDown();
    });
});

当我执行 response.status 的 console.log 时,我看到了 200。但是当我执行

expect(response.status).to.equal(400);//response.status is an int

通过测试!

我做错了什么?

您忘记传递完成回调。 it 被视为与 0 个假设同步。

it('should\'ve started the server', function (done) {
    chai.request('http://127.0.0.1:1121')
        .get('/')
        .end(function(err, response){
            console.log(response.status);
            expect(500).to.equal(400);// This passes? What?
            done();
        });
});

您必须在 itbeforeafter 语句中传递 done 以保持异步流程。

describe('Rest API', (done) => {
before(() => {
    dexterServer.startUp();
});

it('should\'ve started the server', function (done) {
    chai.request('http://127.0.0.1:1121')
        .get('/')
        .end(function(err, response){
            console.log(response.status);
            expect(500).to.equal(400);// This passes? What?
            done();
        });
});

after((done) => {
    dexterServer.tearDown();
});
});

Mocha 支持 promise,因此您可以使用 chai-http 产生 promise 而只是 return promise 的事实:

it('should\'ve started the server', function () {
    // Return the promise.
    return chai.request('http://127.0.0.1:1121')
        .get('/')
        // Use .then instead of .end.
        .then(function(response){
            console.log(response.status);
            expect(500).to.equal(400);
        });
});

如果你需要对错误进行特殊处理,你也可以有一个.catch。否则,您可以让 Mocha 将任何错误作为失败处理。