2015-04-12 33 views
3

我想測試一個使用Kue的應用程序,以便在每次測試之前作業隊列都是空的,並在每次測試後清除。隊列應該功能齊全,我需要能夠檢查已經在隊列中的作業的狀態。測試使用Kue的Node.js應用程序

我試過mock-kue,它運行良好,直到我不得不從隊列中取得工作並分析它們。我無法通過工作編號返回工作。

情況,我需要能夠測試:

  1. 有事而且應該在隊列中的給定類型的工作,
  2. 有事,併產生了一份工作。還有其他事情發生,並且該工作被移除並被另一個工作(重新安排或現有工作)取代。

接縫很簡單,但我很難解決問題。所有的指針都是受歡迎的。

回答

2

根據我的經驗,只需簡單地在本地主機上運行redis即可運行測試,而不是處理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

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

    // ... 
    }); 
});