Представление связанных методов и членов Typescript через тесты Mocha - PullRequest
0 голосов
/ 06 мая 2020

Я тестирую файл контроллера node.js с использованием mocha и chai, и я не могу имитировать объект ответа в моем тесте

TestController.ts

export class TestController {

    static async getTest(req:any, res:any, next:object) {
        console.log("Test");
        //some code here
        res.status(200).json(result.rows);
    }

и это отлично работает, когда я вызываю API, возвращает правильный ответ et c. Но когда я пытаюсь протестировать этот Контроллер, вот что у меня есть для моего тестового файла

Test.ts

it('Get Test method', async function () {
    let req = {params: {testid: 12345}};
    let res:any = {
      status: function() { }
    };

    res.json = '';
    let result = await TestController.getTest(req, res, Object);
});

Я не уверен, как представить здесь объект ответа. Если я просто объявляю переменную res следующим образом

let res:any;

, я вижу следующую ошибку в моем тесте

TypeError: Cannot read property 'json' of undefined

Я не уверен, как должна быть структура данных моего ответа res для заставляя этот тест работать.

1 Ответ

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

Вы должны использовать sinon.stub().returnsThis() для имитации контекста this, это позволяет вам вызывать методы цепочки.

Например,

controller.ts:

export class TestController {
  static async getTest(req: any, res: any, next: object) {
    console.log('Test');
    const result = { rows: [] };
    res.status(200).json(result.rows);
  }
}

controller.test.ts:

import { TestController } from './controller';
import sinon from 'sinon';

describe('61645232', () => {
  it('should pass', async () => {
    const req = { params: { testid: 12345 } };
    const res = {
      status: sinon.stub().returnsThis(),
      json: sinon.stub(),
    };
    const next = sinon.stub();
    await TestController.getTest(req, res, next);
    sinon.assert.calledWithExactly(res.status, 200);
    sinon.assert.calledWithExactly(res.json, []);
  });
});

результаты модульного тестирования со 100% покрытием:

  61645232
Test
    ✓ should pass


  1 passing (14ms)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |     100 |      100 |     100 |     100 |                   
 controller.ts |     100 |      100 |     100 |     100 |                   
---------------|---------|----------|---------|---------|-------------------
...