使用 sinon 存根在 mocha 中对 ES6 函数导入进行存根

ruc*_*ciu 9 mocha.js node.js sinon supertest babeljs

我正在尝试根据超级测试库的请求,在 Express Router 中的一条路由上调用存根函数。我看到函数 foo 被正确调用,不幸的是它没有被我在测试中编写的存根函数替换。代码是用 ES6 编写的,我正在使用babel-registerbabel-polyfill来使其工作。

我使用运行测试脚本

./node_modules/mocha/bin/mocha server --timeout 10000 --compilers js:babel-register --require babel-polyfill --recursive
Run Code Online (Sandbox Code Playgroud)

路由器.js

import {foo} from '../controller';
const router = new Router();
router.route(ROUTE).post(foo);
Run Code Online (Sandbox Code Playgroud)

控制器.js

export function foo(req, res) {
    res.status(200).send({
        ok: 'ok'
    });
}
Run Code Online (Sandbox Code Playgroud)

测试.js

import request from 'supertest';
import sinon from 'sinon';
import {app} from 'app';
import * as controller from 'controller';

const agent = request.agent(app);
describe('Admin routes tests', () => {
    it('Tests login admin route', async () => {
    const bar = () => {
        console.log('bar');
    };
    sinon.stub(controller, 'foo', bar);
    const req = await agent
        .post(ROUTE)
        .set('Accept', 'application/json');
    console.log(stub.calledOnce); // false
    });
});
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激。

sli*_*wp2 3

这是解决方案:

\n\n

app.js:

\n\n
import express from "express";\nimport * as controller from "./controller";\n\nconst app = express();\n\napp.post("/foo", controller.foo);\n\nexport { app };\n
Run Code Online (Sandbox Code Playgroud)\n\n

controller.js:

\n\n
export function foo(req, res) {\n  res.status(200).send({ ok: "ok" });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

test.js:

\n\n
import request from "supertest";\nimport sinon from "sinon";\nimport * as controller from "./controller";\nimport { expect } from "chai";\n\ndescribe("Admin routes tests", () => {\n  it("Tests login admin route", (done) => {\n    const bar = () => {\n      console.log("bar");\n    };\n    const fooStub = sinon.stub(controller, "foo").callsFake(bar);\n    const { app } = require("./app");\n    const agent = request.agent(app);\n    agent\n      .post("/foo")\n      .set("Accept", "application/json")\n      .timeout(1000)\n      .end((err, res) => {\n        sinon.assert.calledOnce(fooStub);\n        expect(res).to.be.undefined;\n        expect(err).to.be.an.instanceof(Error);\n        done();\n      });\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于您存根foo控制器及其返回值为undefined. 对于supertest,没有响应,比如res.send(),服务器会挂起,直到摩卡测试超时,从而导致测试失败。

\n\n

.mocharc.yml:

\n\n
recursive: true\nrequire: ts-node/register\ntimeout: 2000\ndiff: true\ninline-diffs: true\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们添加.timeout(1000)超级测试,因为我们知道它会超时(你用 存根控制器foobar。并且,针对此超时错误做出断言。

\n\n

集成测试结果与覆盖率报告:

\n\n
recursive: true\nrequire: ts-node/register\ntimeout: 2000\ndiff: true\ninline-diffs: true\n
Run Code Online (Sandbox Code Playgroud)\n\n

源代码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/41600031

\n