覆盖摩卡"它"支持"产量"使用"暂停"

时间:2014-04-12 01:04:04

标签: node.js generator mocha yield suspend

在我的测试中使用suspend包处理异步调用时,我想在更多" DRY"中编写规范。办法。例如,以下代码

it('works like fifo queue', function(done) {
  suspend.run(function*() {
    yield transport.enqueue({a:1});
    yield transport.enqueue({b:1});
    (yield transport.dequeue()).should.eql({a: 1});
    (yield transport.dequeue()).should.eql({b: 1});
  }, done);
});

可以简化为:

it('works like fifo queue', function*() {
  yield transport.enqueue({a:1});
  yield transport.enqueue({b:1});
  (yield transport.dequeue()).should.eql({a: 1});
  (yield transport.dequeue()).should.eql({b: 1});
});

如何覆盖"它"用mocha函数包装生成器函数?

2 个答案:

答案 0 :(得分:1)

确定。好像它的功能是全局的。所以这就是我最终解决的问题

// spec_helper.js
var suspend = require('suspend');

// Add suspend support to "it-blocks"
var originalIt = it;                  // remember the original it
it = function(title, test) {          // override the original it by a wrapper

  // If the test is a generator function - run it using suspend
  if (test.constructor.name === 'GeneratorFunction') {
    originalIt(title, function(done) {
      suspend.run(test, done);
    });
  }
  // Otherwise use the original implementation
  else {
    originalIt(title, test);
  }
}

然后在测试套件中执行:

require('spec_helper');

describe("Something", function() {
  it ("Supports generators", function*() {
    // Use yields here for promises
    ...
  });

  it ("is compatible with regular functions", function() {
    // Can't use yields here
    ...
  });
});

答案 1 :(得分:0)

我已经通过Igor S.尝试了解决方案,但它确实有效。

但是,我还发现有两个节点模块声称可以通过安装它们来解决这个问题:

我尝试了后者,它也有效。也许安装软件包比编写自定义代码更容易,尽管理想的解决方案是mocha支持开箱即用。