javascript - Mocha 单元测试不调用对象内的函数生成器

标签 javascript node.js mocha.js

我有一个包含许多 function* 类型生成器的对象,我正在尝试为其编写 Mocha 单元测试。但是,Mocha 不会调用这些函数,我很难弄清楚解决方案是什么。

这里是一些示例代码:

'use strict';

var ctr = {
        fn: function(arg,cb) {
                console.log( 'arg:', arg );
                var err = (arg == true);
                return cb( err, arg );
        }
};

describe( 'Mocha test', function() {
        it( 'should call the function', function(done) {
                console.log('a');
                ctr.fn( false, function(err,data) {
                        console.log('b');
                        if( err ) return done(err);
                        console.log('c');
                        done();
                        console.log('d');
                });
                console.log('e');
        });
});

当我运行 $ mocha testfile.js 时,我得到以下输出:

  Mocha test
a
arg: false
b
c
    ✓ should call the function (39ms)
d
e
  1 passing (172ms)

这一切都符合预期。但是,如果我将“fn: function(...”替换为“fn: function*(...”,则运行 $ mocha testfile.js 结果:

  Mocha test
a
e
    1) should call the function


  0 passing (2s)
  1 failing

  1) Mocha test should call the function:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

我想我找到了答案 Mocha plugin ,但运行 mocha -r mocha-plugin-co testfile.js 给出的结果与未指定它的结果相同。

我认为我需要“确保 Promise 得到解决”,但我不清楚这意味着什么。我没有[故意]使用 Promises,但我使用的 npm 包需要以这种形式定义的函数。

是否有一个简单的解决方案可以使 Mocha 按照我期望的方式工作,或者我是否需要将所有代码更改为常规函数并希望不会出现任何问题?

最佳答案

您应该在返回的生成器上调用 next() 方法,如下所示:

describe( 'Mocha test', function() {
        it( 'should call the function', function(done) {
                console.log('a');
                ctr.fn( false, function(err,data) {
                        console.log('b');
                        if( err ) return done(err);
                        console.log('c');
                        done();
                        console.log('d');
                }).next();
                console.log('e');
        });
});

为了使用 blakeembrey/co-mocha插件,您必须在生成器中使用 yield 才能继续执行。

关于javascript - Mocha 单元测试不调用对象内的函数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318111/

相关文章:

javascript - 在 Webpack 配置的 `plugins` 或 `minimizer` 部分中使用 uglifyjs-webpack-plugin 吗?

javascript - Mocha,数组的数组和范围

javascript - 从外部样式表(从文件)读取样式属性

node.js - 使用 Node.js 进行 api 身份验证

javascript - 为什么我不能使用 window.open() 打开多个页面?

node.js - 如何从 Jenkins 运行 npm/grunt 命令

javascript - 如何在 "before" Hook 中获取 Mocha 测试名称?

javascript - ChaiJS 不处理异常

javascript - 如何在一台 TURN 服务器出现故障时恢复 WebRTC 调用

javascript - jquery click 事件交换文本在第一次点击时不触发但在之后工作