3

各テストの前にジョブ キューが空になり、各テストの後にクリアされるように、 Kueを使用するアプリケーションをテストしたいと思います。キューは完全に機能する必要があり、既にキューにあるジョブのステータスを確認できる必要があります。

mock-kueを試してみたところ、キューからジョブを取得して分析するまでうまくいきました。ジョブ ID でジョブを返すことができませんでした。

テストできるようにする必要がある状況:

  1. 何かが起こり、特定のタイプのジョブがキューにあるはずです。
  2. 何かが起こり、仕事が生まれます。何か他のことが起こり、そのジョブは削除され、別のジョブ (再スケジュールまたは既存のジョブ) に置き換えられます。

継ぎ目は簡単ですが、問題に頭を悩ませるのに苦労しています。すべてのポインタを歓迎します。

4

2 に答える 2

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

    // ...
  });
});
于 2016-12-29T19:47:53.520 に答える