从回调调用的Stub Node.js实用程序函数(Sinon和Agenda)
我正在对后台作业使用agenda,并尝试测试define方法,以确保1.)调用agenda.define,2.)调用agenda.define(triggerSend)中的方法 我已经包括了我用来做这个测试的四个文件:1.)议程作业定义2.)triggerSend实用程序函数3.)sinon存根4.)实际测试。我将非常感谢你能提供的一切帮助 现在,agenda.define被调用了两次,我可以看到triggerSend的日志被调用了两次。第一个triggerSend显示作业对象,第二个triggerSend日志显示从回调调用的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和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
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沙箱。这是必要的,以便测试运行程序不挂起并等待超时