Заглушка импорта функции ES6 в мокко с использованием заглушки sinon

Я пытаюсь заглушить функцию, вызываемую на одном из моих маршрутов в экспресс-маршрутизаторе, с запросом из библиотеки супертестов. Я вижу, что функция foo вызывается правильно, к сожалению, она не заменена функцией-заглушкой, которую я написал в тесте. Код написан на ES6, и я использую babel-register и babel-polyfill, чтобы заставить его работать.

Я запускаю сценарий тестирования, используя

./node_modules/mocha/bin/mocha server --timeout 10000 --compilers js:babel-register --require babel-polyfill --recursive

router.js

import {foo} from '../controller';
const router = new Router();
router.route(ROUTE).post(foo);

контроллер.js

export function foo(req, res) {
    res.status(200).send({
        ok: 'ok'
    });
}

test.js

import request from 'supertest';
import sinon from 'sinon';
import {app} from 'app';
import * as controller from 'controller';

const agent = request.agent(app);
describe('Admin routes tests', () => {
    it('Tests login admin route', async () => {
    const bar = () => {
        console.log('bar');
    };
    sinon.stub(controller, 'foo', bar);
    const req = await agent
        .post(ROUTE)
        .set('Accept', 'application/json');
    console.log(stub.calledOnce); // false
    });
});

Любая помощь приветствуется.


person ruciu    schedule 11.01.2017    source источник
comment
Вы решили эту проблему @ruciu?   -  person diegoaguilar    schedule 29.08.2018
comment
Насколько я помню, я отказался.   -  person ruciu    schedule 29.08.2018


Ответы (1)


Вот решение:

app.js:

import express from "express";
import * as controller from "./controller";

const app = express();

app.post("/foo", controller.foo);

export { app };

controller.js:

export function foo(req, res) {
  res.status(200).send({ ok: "ok" });
}

test.js:

import request from "supertest";
import sinon from "sinon";
import * as controller from "./controller";
import { expect } from "chai";

describe("Admin routes tests", () => {
  it("Tests login admin route", (done) => {
    const bar = () => {
      console.log("bar");
    };
    const fooStub = sinon.stub(controller, "foo").callsFake(bar);
    const { app } = require("./app");
    const agent = request.agent(app);
    agent
      .post("/foo")
      .set("Accept", "application/json")
      .timeout(1000)
      .end((err, res) => {
        sinon.assert.calledOnce(fooStub);
        expect(res).to.be.undefined;
        expect(err).to.be.an.instanceof(Error);
        done();
      });
  });
});

Поскольку вы заглушаете контроллер foo, а его возвращаемое значение равно undefined. Для supertest нет ответа, что-то вроде res.send(), сервер будет зависать до истечения времени ожидания теста мокко, и это приведет к сбою теста.

.mocharc.yml:

recursive: true
require: ts-node/register
timeout: 2000
diff: true
inline-diffs: true

Мы добавляем .timeout(1000) для супертеста, потому что мы знаем, что время ожидания истечет (вы заглушите контроллер foo с помощью bar). И сделайте утверждение для этой ошибки тайм-аута.

Результат интеграционного теста с отчетом о покрытии:

  Admin routes tests
bar
    ✓ Tests login admin route (1341ms)


  1 passing (1s)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |    95.65 |      100 |       80 |    95.65 |                   |
 app.ts        |      100 |      100 |      100 |      100 |                   |
 controller.ts |       50 |      100 |        0 |       50 |                 2 |
 test.ts       |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

Исходный код: https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/41600031

person slideshowp2    schedule 20.12.2019
comment
Спасибо за ответ, я думал, что никогда не узнаю, почему это не удалось. - person ruciu; 20.12.2019