Я пытаюсь настроить модульные тесты в своем проекте. Для этого я использую мокчай-чай и синон-либрайри. Я использую сервер NodeJs версии 8.
Версии:
Синон: "7.1.0" Мокка: "5.1.0" Чай: "4.2.0"
Я хотел бы заглушить метод, который объявлен в другом файле.
Вот пример:
- a.js
exports.FnA(return FnB())
- b.js
exports.FnB()
Я хочу заглушить метод FnB () из файла b.js, чтобы я мог проверить FnA () независимо от возврата FnB ().
Вот что я пробовал:
beforeEach(() => {
this.FnBStub = sinon.stub(b, 'FnB').returns('mocked');
});
afterEach(() => this.FnBStub.restore());
it('should mocked FnB function', () => {
try {
console.log(b.FnB()); //returns 'mocked'
console.log(a.FnA()); //return error from FnB() execution ...
} catch (e) {
console.log(e);
}
});
Он заглушает метод FnB (), но только когда я вызвал его из экземпляра b-файла. Поэтому, когда я позвонил в FnA (), заглушка, похоже, ушла ...
Что мне не хватает?
Некоторая помощь была бы действительно оценена, спасибо :)
EDIT :
Пример a.js:
const FnB = require('./FnB)
exports.FnA = data => {
const limit = data.releases.update ? 60 : 20;
return FnB(data.ref, limit)
};
Пример b.js:
exports.FnB = (ref, page, query) => {
//API call
}
Пример testFile.js:
const a = require('../a')
const b = require('../b')
beforeEach(() => {
this.FnBStub = sinon.stub(b, 'FnB').returns('mocked');
});
afterEach(() => this.FnBStub.restore());
it('should mocked FnB function', () => {
try {
console.log(b.FnB()); //returns 'mocked'
console.log(a.FnA()); //return error from FnB() execution ...
} catch (e) {
console.log(e);
}
});
Поэтому, как я уже сказал, я хотел бы заглушить этот метод вызова FnB и просто проверить, вызван ли этот метод с правильными параметрами.
Всего 1 ответ
Если экспортируемый модуль является самой функцией, а не частью объекта, вы не можете его заглушить напрямую.
Вам нужно использовать что-то вроде proxyquire . Ваш тестовый код будет выглядеть примерно так:
const FnBstub = sinon.stub();
const proxyquire = require('proxyquire');
const a = proxyquire('../a', {
FnB: FnBstub
});
const b = require('../b');
Для получения дополнительной информации смотрите здесь: https://github.com/sinonjs/sinon/issues/664