Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 测试同步代码大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一段使用 node-sync代码,如下所示:

function funcA() {
  return new Promise(function(resolve,reject) {
    Sync(function () {
      return funcB.sync();
    },function (err,result) {
      if(err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
}

代码使用mocha chai进行测试:

it("should return array",function() {
  return funcA().then(function(result) {
    expect(result).to.be.an.instanceof(Array);
  });
});

几个月前它工作得很好,但现在这个测试总是超时:

到目前为止我尝试过的:

>使用done()而不是返回一个promise
>用synchronize.js替换node-sync
>增加超时

我发现的是,期望(…这个测试的一部分实际上是被调用的,但只有在mocha杀死测试之后.无论当前设置了什么超时间隔,期望(…总是被调用〜我收到错误:超时消息后20毫秒.

我通过在测试文件的顶部添加seTinterval(function(){},10)来解决此问题.我想知道为什么这有效,如果有更好的方法解决这个问题?

[编辑]看起来这是一个特定于节点版本的问题.测试在0.12.4上失败,但在0.10.38上正确运行.

[编辑]实际代码可用here.

解决方法

基于您的 code,我假设您的funcB函数以同步方式运行代码.

所以当我以这种方式创建funcB时:

function funcB() {
  return [1,2,3];
}

并运行测试,Mocha显示错误

但是如果我在asynchronus函数中转换funcB如下:

function funcB(cb) {
  process.nextTick(function () {
    cb(null,[1,3]);
  });
}
@H_631_5@mocha运行测试没有任何问题:

所以我的完整代码运行正常(funcB评论是导致错误代码)是这样的

// install dependencies
// npm install promise
// npm install sync
var Promise = require('promise');
var assert = require('assert');
var Sync = require('sync');

function funcA() {
  return new Promise(function (resolve,result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  });
}

// function funcB() {
//   return [1,3];
// }

function funcB(cb) {
  process.nextTick(function () {
    cb(null,3]);
  });
}

it("should return an array",function(donE) {
  return funcA().then(
    function (result) {
      console.log(result);
      assert.equal(Array.isArray(result),truE);
      done();
    }
  );
});

所以我认为我认为同步库创建的sync method(在同步函数上使用它)的误用是造成这个问题的原因.

大佬总结

以上是大佬教程为你收集整理的node.js – 测试同步代码全部内容,希望文章能够帮你解决node.js – 测试同步代码所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。