使用 sinon stub 在 mocha 中导入 ES6 函数
Stubbing ES6 function import in mocha using sinon stub
我正在尝试根据 supertest 库的请求对在 express Router 中我的一条路线上调用的函数进行存根。我看到函数 foo 被正确调用,不幸的是它没有被我在测试中编写的存根函数替换。代码是用 ES6 编写的,我正在使用 babel-register
和 babel-polyfill
使其工作。
我 运行 使用
测试脚本
./node_modules/mocha/bin/mocha server --timeout 10000 --compilers js:babel-register --require babel-polyfill --recursive
router.js
import {foo} from '../controller';
const router = new Router();
router.route(ROUTE).post(foo);
controller.js
export function foo(req, res) {
res.status(200).send({
ok: 'ok'
});
}
test.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
});
});
如有任何帮助,我们将不胜感激。
解决方法如下:
app.js
:
import express from "express";
import * as controller from "./controller";
const app = express();
app.post("/foo", controller.foo);
export { app };
controller.js
:
export function foo(req, res) {
res.status(200).send({ ok: "ok" });
}
test.js
:
import request from "supertest";
import sinon from "sinon";
import * as controller from "./controller";
import { expect } from "chai";
describe("Admin routes tests", () => {
it("Tests login admin route", (done) => {
const bar = () => {
console.log("bar");
};
const fooStub = sinon.stub(controller, "foo").callsFake(bar);
const { app } = require("./app");
const agent = request.agent(app);
agent
.post("/foo")
.set("Accept", "application/json")
.timeout(1000)
.end((err, res) => {
sinon.assert.calledOnce(fooStub);
expect(res).to.be.undefined;
expect(err).to.be.an.instanceof(Error);
done();
});
});
});
由于您对 foo
控制器存根并且其 return 值为 undefined
。对于supertest
,没有响应,像res.send()
,服务器会挂起,直到mocha测试超时,导致测试失败。
.mocharc.yml
:
recursive: true
require: ts-node/register
timeout: 2000
diff: true
inline-diffs: true
我们为超级测试添加 .timeout(1000)
,因为我们知道它会超时(你用 bar
存根 foo
控制器)。并且,对这个超时错误进行断言。
集成测试结果与覆盖率报告:
Admin routes tests
bar
✓ Tests login admin route (1341ms)
1 passing (1s)
---------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files | 95.65 | 100 | 80 | 95.65 | |
app.ts | 100 | 100 | 100 | 100 | |
controller.ts | 50 | 100 | 0 | 50 | 2 |
test.ts | 100 | 100 | 100 | 100 | |
---------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/Whosebug/41600031
我正在尝试根据 supertest 库的请求对在 express Router 中我的一条路线上调用的函数进行存根。我看到函数 foo 被正确调用,不幸的是它没有被我在测试中编写的存根函数替换。代码是用 ES6 编写的,我正在使用 babel-register
和 babel-polyfill
使其工作。
我 运行 使用
测试脚本./node_modules/mocha/bin/mocha server --timeout 10000 --compilers js:babel-register --require babel-polyfill --recursive
router.js
import {foo} from '../controller';
const router = new Router();
router.route(ROUTE).post(foo);
controller.js
export function foo(req, res) {
res.status(200).send({
ok: 'ok'
});
}
test.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
});
});
如有任何帮助,我们将不胜感激。
解决方法如下:
app.js
:
import express from "express";
import * as controller from "./controller";
const app = express();
app.post("/foo", controller.foo);
export { app };
controller.js
:
export function foo(req, res) {
res.status(200).send({ ok: "ok" });
}
test.js
:
import request from "supertest";
import sinon from "sinon";
import * as controller from "./controller";
import { expect } from "chai";
describe("Admin routes tests", () => {
it("Tests login admin route", (done) => {
const bar = () => {
console.log("bar");
};
const fooStub = sinon.stub(controller, "foo").callsFake(bar);
const { app } = require("./app");
const agent = request.agent(app);
agent
.post("/foo")
.set("Accept", "application/json")
.timeout(1000)
.end((err, res) => {
sinon.assert.calledOnce(fooStub);
expect(res).to.be.undefined;
expect(err).to.be.an.instanceof(Error);
done();
});
});
});
由于您对 foo
控制器存根并且其 return 值为 undefined
。对于supertest
,没有响应,像res.send()
,服务器会挂起,直到mocha测试超时,导致测试失败。
.mocharc.yml
:
recursive: true
require: ts-node/register
timeout: 2000
diff: true
inline-diffs: true
我们为超级测试添加 .timeout(1000)
,因为我们知道它会超时(你用 bar
存根 foo
控制器)。并且,对这个超时错误进行断言。
集成测试结果与覆盖率报告:
Admin routes tests
bar
✓ Tests login admin route (1341ms)
1 passing (1s)
---------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files | 95.65 | 100 | 80 | 95.65 | |
app.ts | 100 | 100 | 100 | 100 | |
controller.ts | 50 | 100 | 0 | 50 | 2 |
test.ts | 100 | 100 | 100 | 100 | |
---------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/Whosebug/41600031