如何在chaiHttp请求中模拟方法

时间:2019-08-14 17:49:54

标签: node.js typescript chai-http

编辑:在花了无数时间进行学习之后,我似乎遇到的潜在问题是,测试位于与实际来源不同的目录中,该目录在运行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()中被模拟。如果是这样,那怎么办?如果没有,我该如何嘲笑?

0 个答案:

没有答案