测试 Node.js 个使用 Kue 的应用程序
Testing Node.js application that uses Kue
我想测试一个使用 Kue 的应用程序,以便作业队列在每次测试前为空,并在每次测试后清除。队列应该功能齐全,我需要能够检查队列中已经存在的作业的状态。
我尝试了 mock-kue,它运行良好,直到我不得不从队列中获取作业并对其进行分析。我无法通过职位 ID 找到 return 个职位。
我需要能够测试的情况:
- 发生了一些事情,队列中应该有给定类型的作业,
- 某事发生并产生了一份工作。发生了其他事情,该工作被删除并被另一个工作取代(重新安排或现有工作)。
接缝很简单,但我很难解决这个问题。欢迎大家指点。
根据我的经验,无论你想 运行 你的测试,直接在本地主机上安装 redis 运行ning 比处理模拟版本的 kue 更直接。
首先,要确保每次测试前kue是空的,它可以像刷新redis一样简单,例如:
var kue = require('kue');
var queue = kue.createQueue();
queue.client.flushdb(function(err) {});
对于 #1,kue 有一个 rangeByType() 方法可以解决您的问题:
var getJobs = function(type, state, cb) {
kue.Job.rangeByType(type, state, 0, -1, 'asc', cb);
}
// After something happens
getJobs('myJobType', 'active', function(err, jobs) {});
对于 #2,您可以使用相同的方法,只需跟踪作业 ID 即可知道它已被替换:
var jobId;
getJobs('myJobType', 'active', function(err, jobs) {
assert.lengthOf(jobs, 1);
jobId = jobs[0].id;
});
// After the thing happens
getJobs('myJobType', 'active' function(err, jobs) {
assert.lengthOf(jobs, 1);
assert.notEqual(jobId, jobs[0].id);
});
如果您需要通过 ID 查询职位,您可以这样做:
kue.Job.get(jobId, function(err, job) {});
看看 kue-mock 库,它更可能用于集成测试而不是单元测试。
The library doesn't hack on any kue's internals (replacing/overriding methods etc.). Instead, it creates the original queue instance with a separate redis namespace, then, when stubbing, it creates job process handlers on the fly, putting its own implementation that gives you the ability to control the job processing behaviour.
用法示例:
const expect = require('chai').expect;
const kue = require('kue');
const KueMock = require('kue-mock');
const $queue = new KueMock(kue);
const app = require('./your-app-file');
describe('functionality that deals with kue', () => {
before(() => $queue.clean());
afterEach(() => $queue.clean());
it('enqueues a job providing some correct data', () => {
let jobData;
$queue.stub('your job type', (job, done) => {
jobData = job.data;
done();
});
return yourJobRunnerFunction()
.then(() => {
expect(jobData).to.be.an('object')
.that.is.eql({ foo: 'bar' });
});
});
describe('when the job is completed', () => {
beforeEach(() => {
$queue.stub('your job type')
.yields(null, { baz: 'qux' });
});
it('correctly handles the result', () => {
return yourJobRunnerFunction()
.then((result) => {
expect(result).to.eql({ baz: 'qux' });
});
});
// ...
});
describe('when the job is failed', () => {
beforeEach(() => {
$queue.stub('your job type')
.yields(new Error('Oops!'));
});
it('correctly handles the job result', () => {
return yourJobRunnerFunction()
.catch((err) => {
expect(err).to.be.an('error')
.with.property('message', 'Oops!');
});
});
// ...
});
});
我想测试一个使用 Kue 的应用程序,以便作业队列在每次测试前为空,并在每次测试后清除。队列应该功能齐全,我需要能够检查队列中已经存在的作业的状态。
我尝试了 mock-kue,它运行良好,直到我不得不从队列中获取作业并对其进行分析。我无法通过职位 ID 找到 return 个职位。
我需要能够测试的情况:
- 发生了一些事情,队列中应该有给定类型的作业,
- 某事发生并产生了一份工作。发生了其他事情,该工作被删除并被另一个工作取代(重新安排或现有工作)。
接缝很简单,但我很难解决这个问题。欢迎大家指点。
根据我的经验,无论你想 运行 你的测试,直接在本地主机上安装 redis 运行ning 比处理模拟版本的 kue 更直接。
首先,要确保每次测试前kue是空的,它可以像刷新redis一样简单,例如:
var kue = require('kue');
var queue = kue.createQueue();
queue.client.flushdb(function(err) {});
对于 #1,kue 有一个 rangeByType() 方法可以解决您的问题:
var getJobs = function(type, state, cb) {
kue.Job.rangeByType(type, state, 0, -1, 'asc', cb);
}
// After something happens
getJobs('myJobType', 'active', function(err, jobs) {});
对于 #2,您可以使用相同的方法,只需跟踪作业 ID 即可知道它已被替换:
var jobId;
getJobs('myJobType', 'active', function(err, jobs) {
assert.lengthOf(jobs, 1);
jobId = jobs[0].id;
});
// After the thing happens
getJobs('myJobType', 'active' function(err, jobs) {
assert.lengthOf(jobs, 1);
assert.notEqual(jobId, jobs[0].id);
});
如果您需要通过 ID 查询职位,您可以这样做:
kue.Job.get(jobId, function(err, job) {});
看看 kue-mock 库,它更可能用于集成测试而不是单元测试。
The library doesn't hack on any kue's internals (replacing/overriding methods etc.). Instead, it creates the original queue instance with a separate redis namespace, then, when stubbing, it creates job process handlers on the fly, putting its own implementation that gives you the ability to control the job processing behaviour.
用法示例:
const expect = require('chai').expect;
const kue = require('kue');
const KueMock = require('kue-mock');
const $queue = new KueMock(kue);
const app = require('./your-app-file');
describe('functionality that deals with kue', () => {
before(() => $queue.clean());
afterEach(() => $queue.clean());
it('enqueues a job providing some correct data', () => {
let jobData;
$queue.stub('your job type', (job, done) => {
jobData = job.data;
done();
});
return yourJobRunnerFunction()
.then(() => {
expect(jobData).to.be.an('object')
.that.is.eql({ foo: 'bar' });
});
});
describe('when the job is completed', () => {
beforeEach(() => {
$queue.stub('your job type')
.yields(null, { baz: 'qux' });
});
it('correctly handles the result', () => {
return yourJobRunnerFunction()
.then((result) => {
expect(result).to.eql({ baz: 'qux' });
});
});
// ...
});
describe('when the job is failed', () => {
beforeEach(() => {
$queue.stub('your job type')
.yields(new Error('Oops!'));
});
it('correctly handles the job result', () => {
return yourJobRunnerFunction()
.catch((err) => {
expect(err).to.be.an('error')
.with.property('message', 'Oops!');
});
});
// ...
});
});