摩卡测试正在进行中

时间:2015-09-15 01:21:18

标签: javascript node.js mocha

我正在运行Node.js 4.0,因此它现在支持生成器。

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

无论哪种方式,只要我开始尝试使我的mocha测试生成器友好,我在添加*以使我的mocha单元测试生成器之后获得所有这些测试的超时。我注意到它甚至没有运行我的测试实现代码。它到达我的测试的* function(),当它只是坐着并超时时它。

我现在正在使用gulp-mocha

myTests.js

"use strict";

var chai = require('chai'),
    should = chai.should(),
    testUtil = require('../../../test/testUtilities'),
    carUseCase = require('../../../src/usecases/carGet'),
    gateway= require('../../../test/gateway'),
    carRequestModel = require('../../../src/models/http/request/carRequest');

describe('Get Car by Id', function() {

    it('should return no car when no cars exist', function*(done){
        var cars = [];

        inMemoryGateway.data(cars);
        carUseCase.gateway(gateway);

        var request = testUtil.createCarRequest();
        var responseModel = yield carUseCase.find(request);
        should.not.exist(responseModel.cars);

        var request = testUtil.createCarRequest(0, "", "", "");
        var responseModel = yield carUseCase.find(request);
        should.not.exist(responseModel.cars);

        done();
    });

gulp.js

var gulp = require('gulp'),
    mocha = require('gulp-mocha');

...
    gulp.task('mocha-unit', function() {
        process.env.PORT = 5001;
        return gulp.src([config.test.src.unit], { read: false })
            .pipe(mocha({
                reporter: config.test.mocha.reporter,
                ui: 'bdd'
            }))
    });

carGet.js

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;
    }
};

gatewayTestDouble.js

'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.

1 个答案:

答案 0 :(得分:0)

这里发生了一些事情。

  1. 由于您已将done声明为回调参数,因此Mocha会等待它被调用,因为... ...
  2. Mocha不支持生成器作为回调。它只看到你的回调返回了一个迭代器。由于Mocha没有运行迭代器来完成,因此永远不会达到done()调用。
  3. Mocha 确实支持返回promises的函数,作为在其arg列表中声明done的函数的互斥替代。

    co实用程序可以包装迭代多个promise的生成器,将它们转换为返回单个promise的函数。

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

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

    请注意,您可以选择执行以下操作,而Mocha无法区分:

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

    希望有所帮助!