Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从回调调用的Stub Node.js实用程序函数(Sinon和Agenda)_Node.js_Mocha.js_Chai_Sinon_Agenda - Fatal编程技术网

从回调调用的Stub Node.js实用程序函数(Sinon和Agenda)

从回调调用的Stub Node.js实用程序函数(Sinon和Agenda),node.js,mocha.js,chai,sinon,agenda,Node.js,Mocha.js,Chai,Sinon,Agenda,我正在对后台作业使用agenda,并尝试测试define方法,以确保1.)调用agenda.define,2.)调用agenda.define(triggerSend)中的方法 我已经包括了我用来做这个测试的四个文件:1.)议程作业定义2.)triggerSend实用程序函数3.)sinon存根4.)实际测试。我将非常感谢你能提供的一切帮助 现在,agenda.define被调用了两次,我可以看到triggerSend的日志被调用了两次。第一个triggerSend显示作业对象,第二个trigg

我正在对后台作业使用agenda,并尝试测试define方法,以确保1.)调用agenda.define,2.)调用agenda.define(triggerSend)中的方法

我已经包括了我用来做这个测试的四个文件:1.)议程作业定义2.)triggerSend实用程序函数3.)sinon存根4.)实际测试。我将非常感谢你能提供的一切帮助

现在,agenda.define被调用了两次,我可以看到triggerSend的日志被调用了两次。第一个triggerSend显示作业对象,第二个triggerSend日志显示
未定义

我想弄清楚如何准确地捕获agenda.define和triggerSend,使用sinon调用

议程/活动/作业/test.js(带有agenda.define的作业):

活动/trigger.js在agenda.define中调用的triggerSend实用程序函数:

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);
    });
}

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;
    })
});


Capture agenda.define很容易,但调用Capture triggerSend却不容易。这需要准备

我是agendajs用户,本例介绍了我是如何做到这一点的,我使用了您的代码片段,对其进行了一些修改,以使其更易于测试

对于这个测试,我使用包:(为了让议程正常工作,需要mongodb服务器),(作为mongo客户端)、chai、sinon和(需要确保expect在额外时间后运行)

目录中有3个文件:

  • trigger.js,它提供了在作业运行时调用的异步函数定义
  • test.js,提供定义“测试”作业的功能
  • trigger.test.js,它提供测试规范来检查是否调用了agenda.define,以及在“test”作业运行时是否调用了trigger.js中的异步函数
  • //文件:trigger.js
    module.exports={
    发送:异步()=>{
    log('Trigger Send');
    返回承诺。解决(真实);
    }
    };
    
    //文件:test.js
    const trigger=require('./trigger.js');
    module.exports=功能(议程){
    //定义作业名称:test,使用done作为异步作业。
    议程。定义(‘测试’、功能(工作、完成){
    触发器。发送(作业)。然后(完成);
    });
    }
    
    //文件trigger.test.js
    const{MongoMemoryServer}=require('mongodb-memory-server');
    const{MongoClient}=require('mongodb');
    常量议程=要求(“议程”);
    const{expect}=require('chai');
    const sinon=要求(“sinon”);
    常数延迟=要求(“延迟”);
    const testJob=require('./test.js');
    const trigger=require('./trigger.js');
    描述('议程测试',功能(){
    让mongoServer;
    让mongoClient;
    让沙箱;
    让我们讨论议程;
    before(异步函数(){
    mongoServer=新的MongoMemoryServer();
    //从内存服务器获取mongo uri。
    const mongoUri=wait mongoServer.getUri();
    //找客户。
    mongoClient=新的mongoClient(mongoUri{
    useUnifiedTopology:正确,
    });
    //连接到数据库。
    等待mongoClient.connect();
    //启动议程。
    议程=新议程({
    mongo:mongoClient.db(“议程”),
    });
    //启动沙箱。
    sandbox=sinon.createSandbox();
    });
    之后(异步函数(){
    等待mongoClient.close();
    等待mongoServer.stop();
    sandbox.restore();
    });
    它('define called',函数(){
    const spyAgendaDefine=sandbox.spy(Agenda.prototype,'define');
    //定义测试。
    测试工作(议程);
    //希望你能接到电话。
    expect(spyAgendaDefine.calledOnce).to.equal(true);
    //以确保定义的作业名称为:test。
    expect(spyAgendaDefine.args[0][0])to.equal('test');
    });
    它('triggerSend run',异步函数(){
    const spyTriggerSend=sandbox.spy(触发器'send');
    //作业名称测试已在上面定义。
    //正确启动议程。
    等待议程。开始();
    //现在运行测试作业。
    等待议程。现在(“测试”);
    //需要添加下一个滴答声延迟。
    等待延迟(5);
    //正确地停止议程。
    等待议程;
    //期望触发发送被调用一次。
    expect(spyTriggerSend.calledOnce).to.equal(true);
    });
    });
    
    当我在终端使用摩卡咖啡运行时:

    $ npx mocha trigger.test.js 
    
    
      Agenda test
        ✓ define called
    Trigger Send
        ✓ triggerSend run
    
    
      2 passing (109ms)
    
    109ms,相当快,对吗?在内存中启动mongodb服务器不会降低速度:D

    注意事项:

    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;
        })
    });
    
    
    • 在需要运行mongodb服务器之前,先连接到mongodb服务器,正确初始化议程,并初始化sinon沙盒
    • 完成关闭mongodb连接所需的功能后,关闭mongodb服务器,并恢复sinon沙箱。这是必要的,以便测试运行程序不挂起并等待超时