Javascript 摩卡咖啡的测试正在暂停

Javascript 摩卡咖啡的测试正在暂停,javascript,node.js,mocha.js,Javascript,Node.js,Mocha.js,我正在运行Node.js4.0,因此它现在支持生成器 我尝试过gulp mocha co,最近也删除了它,并升级到Node 4.0,因为它现在支持生成器 不管怎样,当我开始尝试使我的摩卡测试生成器友好时,在添加*使我的摩卡单元测试生成器友好后,所有这些测试都会超时。我注意到它甚至没有运行我的测试实现代码。它进入了我的测试的*功能,这时它只是停留并超时 我现在正在使用 myTests.js 大口喝 carGet.js gatewayTestDouble.js 这里发生了几件事 由于您已将done声

我正在运行Node.js4.0,因此它现在支持生成器

我尝试过gulp mocha co,最近也删除了它,并升级到Node 4.0,因为它现在支持生成器

不管怎样,当我开始尝试使我的摩卡测试生成器友好时,在添加*使我的摩卡单元测试生成器友好后,所有这些测试都会超时。我注意到它甚至没有运行我的测试实现代码。它进入了我的测试的*功能,这时它只是停留并超时

我现在正在使用

myTests.js

大口喝

carGet.js

gatewayTestDouble.js


这里发生了几件事

由于您已将done声明为回调参数,Mocha将等待调用它,而这永远不会发生,因为。。。 Mocha不支持将生成器作为回调。它所看到的只是回调返回了一个迭代器。因为Mocha不会运行迭代器直到完成,所以永远不会到达done调用。 但是,Mocha确实支持返回承诺的函数,作为在参数列表中声明完成的函数的互斥替代

该实用工具可以包装迭代多个承诺的生成器,将它们转换为返回单个承诺的函数

为了工作,不要在arg列表中声明done,然后导入co并执行以下操作:

it('should foo', co.wrap(function*() {
  var foo = yield somethingThatReturnsAPromise();
  // do something with foo
}));
请注意,您也可以选择执行以下操作,而摩卡却无法分辨出其中的区别:

it('should foo', co.wrap(function*() {
  return somethingThatReturnsAPromise().then(function(foo) {
    // do something with foo
  });
}));

希望有帮助

谢谢,我还在试着更多地关注发电机,还有co。比如co发电机函数到底是什么?不确定co发电机函数指的是什么,但传递给co的发电机应该只产生承诺,否则co会抛出错误。而通常情况下,您可以从生成器生成任何类型的值。
var car = require('../entities/car'),
    realGateway = require('../../src/gateways/carGateway'),
    carResponse = require('../../src/models/http/response/carResponse'),
    _gateway;

module.exports = {
    find: function *(carRequest){

        carResponse.http.statusCode = 200;

        var entity = yield _gateway.find(carRequest.id);

        if(!entity.cars || entity.cars.length == 0){
            entity.cars = null;
            carResponse.http.statusCode = 204;
        }

        carResponse.cars = entity.cars;

        return carResponse;
    }
};
'use strict';

var _data;

module.exports = {
    data: function(data){
        _data = data
    },
    find: function *(id) {
        var found = [];

        if(id == null && hasData(_data)){
            yield _data;
            return;
        }

        if(!id && !isPositiveNumber(id)){
            yield found;
            return;
        }

        if(isPositiveNumber(id) && hasData(_data)) {
            for (var i = 0; i < _data.length; i++) {
                if (_data[i].id === id)
                    found.push(_data[i]);
            }
        }

        yield found;
    }
};
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
it('should foo', co.wrap(function*() {
  var foo = yield somethingThatReturnsAPromise();
  // do something with foo
}));
it('should foo', co.wrap(function*() {
  return somethingThatReturnsAPromise().then(function(foo) {
    // do something with foo
  });
}));