Как я могу заглушить следующую функцию в Sinon? - PullRequest
0 голосов
/ 29 июня 2018

Моя тестовая функция выглядит следующим образом:

const testLibrary = require("./test");

describe("Top Test", function() {

    it("should test function", function(done) {
        testLibrary.print();
        done();

    });


});

test.ts имеет следующие две функции:

export function stubMe() {
    console.log("original function");
}

export function print() {
    stubMe();
}

Когда я запускаю тест, он печатает: «оригинальная функция»

Я сейчас пытаюсь заглушить мой тест следующим образом:

const testLibrary = require("./test");


const sinon = require("sinon");

const stubMe = sinon.stub(testLibrary, "stubMe");
stubMe.yields();

describe("Top Test", function() {

    it("should test function", function(done) {
        testLibrary.print();
        done();

    });


});

Моя тестовая функция все еще печатает «оригинальную функцию», указывая, что функция не была заглушена.

Как заглушить функцию stubMe?

Обновление:

Я изменил свой код на основе приведенного ниже решения Ankit:

  const sinon = require("sinon");
  const testLibrary = require("./test");

  testLibrary.stubMe();

  const stubMe = new sinon.stub(testLibrary, "stubMe").callsFake(function () {
    console.log("console from stub");
  });

  testLibrary.stubMe();


  describe("Top Test", function () {

    it("should test function", function (done) {
      testLibrary.print();
      done();

    });

  });

Как ни странно, это печатает:

original function
console from stub


  Top Test
original function

Почему заглушка возвращается во время теста?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Нет способа, которым функция может быть шпионить или издеваться. stubMe относится непосредственно к тому же модулю.

Как объяснено в связанном с Jest вопросе , способ улучшить тестируемость состоит в том, чтобы переместить функции в разные модули:

// one module
export function stubMe() {
    console.log("original function");
}

// another module
import { stubMe } from '...';
export function print() {
    stubMe();
}

В этом случае testLibrary.stubMe может быть шпионским или поддельным, но только если используются не собственные модули ES, потому что экспорты модуля ES доступны только для чтения в собственной реализации.

0 голосов
/ 29 июня 2018

Используйте callsFake() вместо yields(), например:

 const testLibrary = require('./test');

  const sinon = require('sinon');

  const stubMe = new sinon.stub(testLibrary, 'stubMe');
  stubMe.callsFake(function () {
    console.log('console from stub');
  });

  describe('Top Test', function () {

    it('should test function', function (done) {
      testLibrary.print();
      done();

    });

  });

Вот вывод для вышеуказанного теста: enter image description here

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