测试使用Kue的Node.js应用程序

时间:2015-04-12 22:19:47

标签: node.js mocha kue

我想测试一个使用Kue的应用程序,以便在每次测试之前作业队列为空,并在每次测试后清除。队列应该是完全正常的,我需要能够检查已经在队列中的作业的状态。

我尝试mock-kue并且它运行良好,直到我必须从队列中获取作业并进行分析。我无法通过工作ID返回工作。

我需要能够测试的情况:

  1. 发生了一些事情,队列中应该有一个给定类型的作业,
  2. 发生了一些事情并创造了一份工作。发生了其他事情并且该工作被移除并替换为另一个工作(重新安排或现有工作)。
  3. 直接接缝,但我很难绕过这个问题。欢迎所有指针。

2 个答案:

答案 0 :(得分:3)

根据我的经验,简单地让redis在localhost上运行,无论你想要运行测试而不是处理模拟版本的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) {});

答案 1 :(得分:1)

看一下kue-mock lib,它更有可能进行集成测试,而不是单位。

  

图书馆不会破解任何kue的内部(替换/覆盖方法等)。相反,它使用单独的redis命名空间创建原始队列实例,然后,当存根时,它会动态创建作业进程处理程序,并使用自己的实现来控制作业处理行为。

使用示例:

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

    // ...
  });
});