ruc*_*ciu 9 mocha.js node.js sinon supertest babeljs
我正在尝试根据超级测试库的请求,在 Express Router 中的一条路由上调用存根函数。我看到函数 foo 被正确调用,不幸的是它没有被我在测试中编写的存根函数替换。代码是用 ES6 编写的,我正在使用babel-register和babel-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)
任何帮助将非常感激。
这是解决方案:
\n\napp.js:
import express from "express";\nimport * as controller from "./controller";\n\nconst app = express();\n\napp.post("/foo", controller.foo);\n\nexport { app };\nRun Code Online (Sandbox Code Playgroud)\n\ncontroller.js:
export function foo(req, res) {\n res.status(200).send({ ok: "ok" });\n}\nRun Code Online (Sandbox Code Playgroud)\n\ntest.js:
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});\nRun Code Online (Sandbox Code Playgroud)\n\n由于您存根foo控制器及其返回值为undefined. 对于supertest,没有响应,比如res.send(),服务器会挂起,直到摩卡测试超时,从而导致测试失败。
.mocharc.yml:
recursive: true\nrequire: ts-node/register\ntimeout: 2000\ndiff: true\ninline-diffs: true\nRun Code Online (Sandbox Code Playgroud)\n\n我们添加.timeout(1000)超级测试,因为我们知道它会超时(你用 存根控制器foo)bar。并且,针对此超时错误做出断言。
集成测试结果与覆盖率报告:
\n\nrecursive: true\nrequire: ts-node/register\ntimeout: 2000\ndiff: true\ninline-diffs: true\nRun Code Online (Sandbox Code Playgroud)\n\n源代码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/41600031
\n