Как мне выполнить модульное тестирование функции, которая вызывает другие функции в том же файле / классе, чтобы я не мог их издеваться? - PullRequest
0 голосов
/ 23 января 2020

У меня есть функция, которая вызывает некоторые другие функции, и я хочу написать для нее модульные тесты. Проблема заключается в том, что при проверке правильности вызова функций они, разумеется, также выполняются, что не работает в моей тестовой среде, поэтому mocha показывает ошибки.
Тестируемая функция может например, это выглядит так:

topFunction(foo, bar){
  if(foo === bar){
    function1();
  } 
  // ...
  function2(foo);
}

function1 и function2 находятся в том же тестируемом файле / классе, что и topFunction .

  1. Если я хочу проверить, правильно ли вызываются function1 и function2 , как мне это сделать правильно?
    Я знаю, что могу передать функции topFunction в качестве аргументов или поместите их в другой класс, который я затем передам классу, в котором находится topFunction , чтобы я мог высмеивать function1 и function2 при тестировании.
  2. Является ли этот тип тестирования неисправностей индикатором плохого дизайна, поэтому я должен изменить код (возможно, так, как я предложил?) Вместо того, чтобы найти обходной путь?

1 Ответ

2 голосов
/ 23 января 2020

Использование sinon.js в качестве библиотеки утверждений. Кроме того, вы можете прочитать этот выпуск . Вот решение для модульного тестирования:

index.js:

function function1() {}

function function2(arg) {}

class SomeClass {
  topFunction(foo, bar) {
    if (foo === bar) {
      exports.function1();
    }
    exports.function2(foo);
  }
}

exports.function1 = function1;
exports.function2 = function2;
exports.SomeClass = SomeClass;

index.test.js:

const sinon = require("sinon");
const mod = require("./");

describe("59877615", () => {
  afterEach(() => {
    sinon.restore();
  });
  it("should call function1 and function2", () => {
    const funtion1Stub = sinon.stub(mod, "function1");
    const funtion2Stub = sinon.stub(mod, "function2");
    const instance = new mod.SomeClass();
    instance.topFunction("a", "a");
    sinon.assert.calledOnce(funtion1Stub);
    sinon.assert.calledOnce(funtion2Stub);
  });

  it("should only call function2", () => {
    const funtion2Stub = sinon.stub(mod, "function2");
    const instance = new mod.SomeClass();
    instance.topFunction("a", "b");
    sinon.assert.calledOnce(funtion2Stub);
  });
});

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

 59877615
    ✓ should call function1 and function2
    ✓ should only call function2


  2 passing (10ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |      100 |      100 |    71.43 |      100 |                   |
 index.js      |      100 |      100 |    33.33 |      100 |                   |
 index.test.js |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...