在 Mocha/Chai/Sinon 中插入数据库连接线
Stubbing a DB connection line in Mocha/Chai/Sinon
我的代码中有以下行有问题
TestController.ts
static async getTest(req:any, res:any, next:object) {
console.log("BEGIN -- TestController.getTest");
let testid = req.params.testid;
let query = `SELECT * FROM TEST WHERE TEST_ID = :1`;
let binds: string[] = [testid];
let result = await ConnectionDB.executeSimpleQuery(query, binds);
}
我现在 运行 在 Test.ts 进行测试,我正在做以下事情
Test.ts
it('Get Order method', function () {
let req = {params: {testid: 12345}};
let res = {
status: '200'
};
//const dbConn = sinon.stub(xxxx, "xxxxxx").returns(true);
TestController.getTest(req, res, Object);
});
我总是在有 ConnectionDB.executeSimpleQuery(query, binds) 的行中得到一个错误;所以我想把它存根并 return 一个示例 json 响应,我不确定如何用 Sinon 做到这一点。
您可以使用 sinon.stub()
为 ConnectionDB.executeSimpleQuery
方法创建存根。
例如
controller.ts
:
import { ConnectionDB } from './db';
export class Controller {
static async getTest(req: any, res: any, next: object) {
console.log('BEGIN -- TestController.getTest');
let testid = req.params.testid;
let query = `SELECT * FROM TEST WHERE TEST_ID = :1`;
let binds: string[] = [testid];
let result = await ConnectionDB.executeSimpleQuery(query, binds);
console.log(result);
}
}
db.ts
:
export class ConnectionDB {
static async executeSimpleQuery(query, bindings) {
return { message: 'real' };
}
}
controller.test.ts
:
import { ConnectionDB } from './db';
import { Controller } from './controller';
import sinon from 'sinon';
describe('61617621', () => {
it('should pass', async () => {
const logSpy = sinon.spy(console, 'log');
const json = { message: 'fake' };
const executeSimpleQueryStub = sinon.stub(ConnectionDB, 'executeSimpleQuery').resolves(json);
const mReq = { params: { testid: 1 } };
const mRes = {};
const mNext = {};
await Controller.getTest(mReq, mRes, mNext);
sinon.assert.calledWithExactly(executeSimpleQueryStub, 'SELECT * FROM TEST WHERE TEST_ID = :1', [1]);
sinon.assert.calledWithExactly(logSpy, { message: 'fake' });
});
});
带有覆盖率报告的单元测试结果:
61617621
BEGIN -- TestController.getTest
{ message: 'fake' }
✓ should pass
1 passing (18ms)
---------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------|---------|----------|---------|---------|-------------------
All files | 90 | 100 | 50 | 90 |
controller.ts | 100 | 100 | 100 | 100 |
db.ts | 50 | 100 | 0 | 50 | 3
---------------|---------|----------|---------|---------|-------------------
我的代码中有以下行有问题
TestController.ts
static async getTest(req:any, res:any, next:object) {
console.log("BEGIN -- TestController.getTest");
let testid = req.params.testid;
let query = `SELECT * FROM TEST WHERE TEST_ID = :1`;
let binds: string[] = [testid];
let result = await ConnectionDB.executeSimpleQuery(query, binds);
}
我现在 运行 在 Test.ts 进行测试,我正在做以下事情
Test.ts
it('Get Order method', function () {
let req = {params: {testid: 12345}};
let res = {
status: '200'
};
//const dbConn = sinon.stub(xxxx, "xxxxxx").returns(true);
TestController.getTest(req, res, Object);
});
我总是在有 ConnectionDB.executeSimpleQuery(query, binds) 的行中得到一个错误;所以我想把它存根并 return 一个示例 json 响应,我不确定如何用 Sinon 做到这一点。
您可以使用 sinon.stub()
为 ConnectionDB.executeSimpleQuery
方法创建存根。
例如
controller.ts
:
import { ConnectionDB } from './db';
export class Controller {
static async getTest(req: any, res: any, next: object) {
console.log('BEGIN -- TestController.getTest');
let testid = req.params.testid;
let query = `SELECT * FROM TEST WHERE TEST_ID = :1`;
let binds: string[] = [testid];
let result = await ConnectionDB.executeSimpleQuery(query, binds);
console.log(result);
}
}
db.ts
:
export class ConnectionDB {
static async executeSimpleQuery(query, bindings) {
return { message: 'real' };
}
}
controller.test.ts
:
import { ConnectionDB } from './db';
import { Controller } from './controller';
import sinon from 'sinon';
describe('61617621', () => {
it('should pass', async () => {
const logSpy = sinon.spy(console, 'log');
const json = { message: 'fake' };
const executeSimpleQueryStub = sinon.stub(ConnectionDB, 'executeSimpleQuery').resolves(json);
const mReq = { params: { testid: 1 } };
const mRes = {};
const mNext = {};
await Controller.getTest(mReq, mRes, mNext);
sinon.assert.calledWithExactly(executeSimpleQueryStub, 'SELECT * FROM TEST WHERE TEST_ID = :1', [1]);
sinon.assert.calledWithExactly(logSpy, { message: 'fake' });
});
});
带有覆盖率报告的单元测试结果:
61617621
BEGIN -- TestController.getTest
{ message: 'fake' }
✓ should pass
1 passing (18ms)
---------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------|---------|----------|---------|---------|-------------------
All files | 90 | 100 | 50 | 90 |
controller.ts | 100 | 100 | 100 | 100 |
db.ts | 50 | 100 | 0 | 50 | 3
---------------|---------|----------|---------|---------|-------------------