Заглушка Sinon не работает, когда используется уничтожение объекта - PullRequest
0 голосов
/ 06 марта 2019

Допустим, у вас есть метод myMethod в модуле myModule, который выглядит следующим образом:

function myMethod() {
   return 5;
}
module.exports.myMethod = myMethod;

Теперь, если я хочу заглушить этот метод, чтобы вернуть 2 вместо 5 с Sinon, я бы написал

const myModule = require('path/myModule');
sinon.stub(myModule, 'myMethod').returns(2);

Теперь в том месте, где вы на самом деле вызываете метод, вы случайно импортируете такой метод с уничтожением объекта

const { myMethod } = require('path/myModule');
console.log(myMethod()); // Will print 5

Если вы это сделаете, myMethod на самом деле не заглушается и не выигрываетВместо этого верните 2, но 5.

Если вместо этого вам снова потребуется модуль и использовать функцию из требуемого модуля, он будет работать

const myModule= require('path/myModule');
console.log(myModule.myMethod()); // Will print 2

Есть ли кто-нибудь, у кого есть решение этой проблемы?кроме простого изменения способа импорта моих функций?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Заглушка myMethod будет иметь другую ссылку, чем исходный метод.В примере с деструктурированием вы устанавливаете ссылку до того, как ее можно поставить в тупик.

// cannot be stubbed
const { myMethod } = require('path/myModule');

// can be stubbed
const myModule = require('path/myModule');
myModule.myMethod();

Проверьте этот аналогичный вопрос для получения более подробной информации

0 голосов
/ 07 марта 2019

Это возможно.

Просто обратите внимание, что как только это запустится:

const { myMethod } = require('./lib');

... он будет помнить то, что myMethod было в тот момент.

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


Итак, для этого lib.js:

function myMethod() {
  return 5;
}
module.exports.myMethod = myMethod;

и это code.js:

const { myMethod } = require('./lib');
console.log(myMethod());

вам просто нужно сделать это:

const sinon = require('sinon');

const myModule = require('./lib');
sinon.stub(myModule, 'myMethod').returns(2);  // set up the stub FIRST...
require('./code');  // ...THEN require the code (prints "2")
...