编写了一个非常简单的代码,将异步用于3个作业。我希望使用Mocha来测试此代码。任何人都可以提供指针来开始使用此代码吗?
var async = require('async');
var each = require('async-each');
var arr = [{name:'job1', delay:100}, {name: 'job2', delay:200},{name:'job3', delay:300}];
async.eachLimit(arr, 3, function(job, callback) {
console.log("Execute the job: " + job.name);
setTimeout(function() {
callback(null, job.name);
}, job.delay);
}, function(error){
console.log(error);
});
答案 0 :(得分:0)
首先,您应该知道,我们只需要测试我们的应用程序代码,而不是async
库的代码。因为async
库已经过全面测试。以下是我们的应用程序代码中的功能:
function(job, callback) {
console.log("Execute the job: " + job.name);
setTimeout(function() {
callback(null, job.name);
}, job.delay);
}
和
function(error){
console.log(error);
}
因此,我们需要进行一些重构,以便于测试。这是完整的工作示例:
index.js
:
const async = require("async");
const arr = [
{ name: "job1", delay: 100 },
{ name: "job2", delay: 200 },
{ name: "job3", delay: 300 },
];
function main() {
async.eachLimit(arr, 3, iteratee, function(error) {
console.log(error);
});
}
function iteratee(job, callback) {
console.log(`Execute the job: ` + job.name);
setTimeout(function() {
callback(null, job.name);
}, job.delay);
}
module.exports = {
main,
iteratee,
};
index.spec.js
:
const { main, iteratee } = require("./");
const sinon = require("sinon");
const async = require("async");
describe("56748106", () => {
let clock;
beforeEach(() => {
clock = sinon.useFakeTimers();
});
afterEach(() => {
clock.restore();
sinon.restore();
});
describe("iteratee", () => {
it("should pass", () => {
sinon.spy(global, "setTimeout");
const job = { name: "job1", delay: 2000 };
const callback = sinon.stub();
iteratee(job, callback);
clock.tick(2000);
sinon.assert.calledWithExactly(callback, null, job.name);
sinon.assert.calledWithExactly(setTimeout, sinon.match.func, job.delay);
});
});
describe("main", () => {
it("should handle error", () => {
const logSpy = sinon.spy(console, "log");
const mError = new Error("some error");
sinon.stub(async, "eachLimit").yieldsRight(mError);
main();
sinon.assert.calledWithExactly(
async.eachLimit,
[
{ name: "job1", delay: 100 },
{ name: "job2", delay: 200 },
{ name: "job3", delay: 300 },
],
3,
iteratee,
sinon.match.func,
);
sinon.assert.calledWithExactly(logSpy, mError);
});
});
});
覆盖率100%的单元测试结果:
56748106
iteratee
Execute the job: job1
✓ should pass
main
Error: some error
at Context.it (/Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/src/stackoverflow/56748106/index.spec.js:1:4680)
at callFn (/Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runnable.js:387:21)
at Test.Runnable.run (/Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runnable.js:379:7)
at Runner.runTest (/Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runner.js:535:10)
at /Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runner.js:653:12
at next (/Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runner.js:447:14)
at /Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runner.js:457:7
at next (/Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runner.js:362:14)
at Immediate._onImmediate (/Users/ldu020/workspace/github.com/mrdulin/mocha-chai-sinon-codelab/node_modules/mocha/lib/runner.js:425:5)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
✓ should handle error
2 passing (20ms)
---------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.js | 100 | 100 | 100 | 100 | |
index.spec.js | 100 | 100 | 100 | 100 | |
---------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/56748106