Синон: как заглушить метод в том же тестируемом файле? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть следующий сценарий, сначала тестируемый класс, называемый utils.js:

var exports = module.exports = {};

[...]

var internalHelper = exports.internalHelper = function internalHelper(params) {

    [...]

    return A.library.promise();
}

[...]

var methodUnderTest = exports.methodUnderTest = function methodUnderTest(params) {

    [...]

    internalHelper(theParams)
    .then(result => {

        [...]

    });

    [...]

}

[...]

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

var internalHelperStub = sinon.stub(utils, 'internalHelper');
internalHelperStub.resolves({ any: 'response' });

Проблема в том, чтовызывается реальный метод, а не заглушка.

Есть пара очень похожих вопросов, которые не удовлетворены ответами:

Почему это нельзя сделать ???

Если для этого есть причина, какова правильная структура кода для служебного класса?

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

РЕДАКТИРОВАТЬ: Джеймс ответил на этот вопрос здесь , я держу свой ответ, поскольку он предоставляет объяснение и решение фрагмента кода.Предоставление модераторам SO помечать их как дубликаты, объединять или делать что-либо еще в этих случаях;)

1 Ответ

0 голосов
/ 09 декабря 2018

Думаю, я нашел способ ее решения.

По сути, Sinon способен заглушить только ссылки, которые предоставляются из файла / класса.

Это означает, что в приведенном ниже сценарии ? вы не сможете заглушить вызов метода B, потому что он вызывается с использованием внутренней ссылки, на которую не влияет заглушка Sinon:

/*********** Code under test: myCode.js ************/

var exports = module.exports = {};

[...]

var B = exports.B = function B() {

}

[...]

var A = exports.A = function A() {
    B();
}

/*********** Test code: myCode.test.js ************/
[...]
bStub = sinon.stub(myCode, 
bStub.returns...

Это result приведет к тому, что реальный метод будет вызываться во время тестирования, независимо от того, используется ли заглушка ...

Чтобы получить метод заглушки, просто используйте его, используя ссылку exports вместо:во фрагменте выше:

var A = exports.A = function A() {
    exports.B();
}
...