Stub Node.js служебная функция, вызываемая из обратного вызова (Sinon и Agenda) - PullRequest
1 голос
/ 07 февраля 2020

Я использую повестку дня для фоновых заданий и пытаюсь проверить метод определения, чтобы убедиться, что: 1) повестки дня. Вызван метод 2. и 2.) вызван метод внутри повестки дня. Определение (triggerSend).

Я включил четыре файла, которые я использую для этого теста: 1.) определение задания повестки дня 2.) служебная функция triggerSend 3.) заглушки sinon 4.) реальный тест. Я буду очень признателен за любую помощь, которую вы можете предложить!

Как и так, повестки дня. Вызывается дважды, и я вижу журналы для триггера, вызываемого дважды. Первый triggerSend показывает объект задания, второй журнал triggerSend показывает undefined.

Я хотел бы выяснить, как я могу точно захватить повестки дня. Определения и triggerSend, используя sinon .

повестка дня / кампании / задания / тест. js (работа с повесткой дня.define):

const triggerSend = require('../../../campaign/trigger.js');

module.exports = function(agenda) {
    agenda.define('test', function(job,done){
        console.log("agenda.define called!");
        triggerSend(job)
        .then(done).catch(done);
    });
}

кампания / триггер. js Функция запуска triggerSend, вызываемая в context.define:

module.exports = async function(job) {
    console.log("triggerSend for job: ", job);
    // Legacy procedural code
}

fixtures / stubs / index. js

const sinon = require('sinon');

module.exports = {
    DefineAgenda: function(agenda, jobMock) {
        return sinon.stub(agenda, 'define').callsFake(function(job, done) {
            /*
            *This is to call the function (job, done) callback from agenda.define,
            *it results in triggerSend being actually called (not the stub) but it
            *also results in agenda.define being called twice.
            */
            return arguments[1](jobMock, done);
        });
    },
    TriggerSend: function(triggerSend, jobMock) {
        return sinon.stub(triggerSend, 'default').callsFake(function(job) {
            console.log("triggerSend arguments: ", arguments)
            return arguments[1](jobMock);
        });
    }
}

test.test. js:

const chai = require("chai");
const expect = chai.expect;

const agenda = require('../../../modules/agenda').campaignInstance();
const triggerSend = require('../../../campaign/trigger.js');
const triggerSendObj = { default: triggerSend };

const DefineAgenda = require('../../../fixtures/stubs').DefineAgenda;
const TriggerSend = require('../../../fixtures/stubs').TriggerSend;
const jobMock = require('../../../fixtures/mocks/jobs').campaign;

const testJob = require('../../../agenda/campaigns/jobs/test.js');

describe('Campaign agenda.define', function() {
    before(function() {
        this.DefineAgendaStub = DefineAgenda(agenda, jobMock);
        this.TriggerSendStub = TriggerSend(triggerSendObj, jobMock);
    });

    it('is called', async function() {
        //call agenda job for test
        testJob(agenda);

        //assertions
        expect(agenda.define.called).to.be.true;
        expect(triggerSendObj.default.called).to.be.true;
    })
});

...