Из import
doc :
Статический оператор import
используется для импорта привязок, которые экспортируются другим модулем.
Таким образом, когда вы делаете это:
import * as userDal from './user.dal';
, в результате userDal
содержит привязки ко всему, что экспортируется модулем user.dal
.
Затем, когда вы делаете это:
sinon.stub(userDal, 'function1').returns('this is my result');
привязка function1
заменена на stub
, который возвращает 'this is my result'
.
Другими словами, экспорт модуля для function1
былзаменен заглушкой .
Поэтому, когда эта строка запускается:
const result = await userDal.function1(id);
, она вызывает экспорт модуля для function1
(которыйбыл задан), поэтому результат будет 'this is my result'
.
С другой стороны, когда эта строка запускается:
const badResult = await userDal.method1(id, date);
она вводит method1
, которая затем запускает эту строку:
const request1 = await function1(id); // this is not faking its results
, который не вызывает экспорт модуля для function1
, он вызывает function1
напрямую .
Чтобы иметь возможность заглушить function1
и function2
в method1
вы должны вызывать их экспорт модулей вместо того, чтобы вызывать их напрямую.
Для Node.js
модуля шаблон выглядит следующим образом:
const function1 = async function (id) { /* ... */ }
const function2 = async function (id) { /* ... */ }
const method1 = async function (id, date) {
const request1 = await exports.function1(id); // call the module export
const request2 = await exports.function2(request1); // call the module export
return request2;
}
exports.function1 = function1;
exports.function2 = function2;
exports.method1 = method1;
Для модуля ES6 схема аналогична.Обратите внимание, что «Модули ES6 поддерживают циклические зависимости автоматически» , поэтому мы можем import
модуль вернуться в себя , чтобы получить доступ к экспорту модуля:
import * as userDal from 'user.dal'; // import module into itself
export async function function1(id) { /* ... */ }
export async function function2(id) { /* ... */ }
export async function method1(id, date) {
const request1 = await userDal.function1(id); // call the module export
const request2 = await userDal.function2(request1); // call the module export
return request2;
}
Если вы следуете этому шаблону и вызываете модуль экспорта для function1
и function2
изнутри method1
, то при замене модуля экспорта для этих двух функций на заглушки,заглушки будут вызываться, когда вы звоните method1
.