Заглушка линии подключения к БД в Mocha / Chai / Sinon - PullRequest
1 голос
/ 05 мая 2020

В моем коде есть следующая строка, которая вызывает проблемы: c

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); поэтому я хочу убрать это и вернуть образец ответа json, и я не уверен, как это сделать с Sinon.

1 Ответ

1 голос
/ 06 мая 2020

Вы можете использовать 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                 
---------------|---------|----------|---------|---------|-------------------
...