编辑:在花了无数时间进行学习之后,我似乎遇到的潜在问题是,测试位于与实际来源不同的目录中,该目录在运行chai时会被转译,即路径没有配对。开玩笑的嘲笑似乎被锁定在路径而不是对象名称上。我尝试使用各种玩笑和打字稿路径参数,但没有任何运气。感谢您对此有任何见识。
以下是用于测试api端点的chaiHttp模块。它基本上建立了一个服务并调用它。作为端到端的集成测试非常有用。
import * as chai from 'chai';
import chaiHttp = require('chai-http');
import * as application from '../../src/api-server';
chai.use(chaiHttp);
describe('CreateUserTest', () => {
let app: any;
let server: application.ApiServer;
beforeAll(async () => {
server = new application.ApiServer();
await server.init();
await server.start();
app = server.getServer();
return new Promise<void>((resolve, reject) => {
resolve();
});
});
afterAll(() => {
server.stop();
});
const subRequest = {
'userId': 'foo',
'token': 'bar',
};
describe('/v1/createuser', () => {
it('Should respond with a 200 status', done => {
chai
.request(app)
.get('/v1/createuser')
.set('Content-Type','application/json')
.send(subRequest)
.end((err, res) => {
expect(res.status).toEqual(200);
done();
});
});
});
});
我想修改测试以模拟服务中调用的数据库层。特别是我想模拟2种方法getTokens和putUser以返回诸如
的静态定义良好的内容const DB = {
token: 'foo',
expires: '2019-08-09T18:10:25.432Z'
};
伪代码:
export class TokenService {
private databaseService: DatabaseService;
constructor(databaseService: DatabaseService) {
this.databaseService = databaseService;
}
public async createUser(req: Request) {
const res = await this.databaseService.getTokens(req);
...
const res = await this.databaseService.putUser(req);
return {
refreshToken: refreshToken,
accessToken: accessToken,
};
}
export class DatabaseService {
public async putUser (req: any) {
...
return;
}
public async getTokens (req: Request) {
const user = await this.queryWrapper(getUserSql,
[
Number(req.userId)
]);
return user;
}
}
我该如何嘲笑这个?我曾在describe beforeAll中尝试过使用这种sinon,但是这似乎被忽略了。
stub1 = sinon.stub(DatabaseService.prototype, 'getTokens').callsFake((req: any)=> {
console.log('Stubbed getTokens');
return DB;
});
stub2 = sinon.stub(DatabaseService.prototype, 'putUser').callsFake((req: any)=> {
console.log('Stubbed putUser');
return;
});
我猜想这必须在beforeAll()中被模拟。如果是这样,那怎么办?如果没有,我该如何嘲笑?