Метод Sinon stub, вызывающий из другого файла

Я пытаюсь настроить модульные тесты в своем проекте. Для этого я использую мокчай-чай и синон-либрайри. Я использую сервер 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


Есть идеи?

10000