【发布时间】:2018-11-26 08:33:33
【问题描述】:
对此有数千个问题,我想我已经阅读了所有这些问题,但我仍然不明白为什么以下内容不起作用。
此代码在本地执行没有问题。在 TravisCI 上运行时 - 它失败并确保 done() 被称为错误。
it('Function oLab.GetObjects & oLab.Deploy', (done) => {
var l = new oLab('1')
l.getObjects().then(function(data){
console.log(data);
expect(data.length).to.above(0);
//There is a bunch of other code in here commented out since this alone doesn't work.
})
.then(() => done(), done)
.catch(function (err) { }); // Not executed
});
我知道 getObjects 函数失败了:
this.getObjects = function () {
console.log("oLab getObjects function");
return getResources(this.id);
}
调用getResources:
function getResources(labID){
return db.any('select * from lab_resources where lab_id = ' + labID).then(function(data){
var resources = [];
//Modifies the resources and returns the list. Logging this displays the correct data.
return resources;
})
.catch(function (err) { }); // Not executed
}
问题:
- 我阅读了这个blog 并基于它添加(完成)到我的函数中,因为我认为我返回了一个承诺。如果它是嵌套的,我会返回一个承诺吗? IE 我调用getObjects 后跟getResources。 getResources 返回一个数据库查询,但在其中 - 有一个返回值。这是否意味着我正在向调用函数返回一个承诺或值?我认为它会返回承诺,因为承诺不会立即执行。
- 在 getObjects 中,我正在尝试设置 oLab 的属性。我应该在 getObjects 函数中设置该属性,还是应该将其返回给我的调用方法,然后更改 oLab 的属性?
【问题讨论】:
-
让其他人阅读这应该是一个很好的提醒,为什么您应该为测试提供良好的描述性名称。我无法告诉您使用“函数 oLab.GetObjects & oLab.Deploy”在这里测试什么。使用
catch和then的第二个回调可能是一个错误,因为您将拦截失败测试产生的错误。 -
@MarkMeyer 我已经记录了两个 catch 语句,但它们都没有记录,因此我认为它们没有执行以及为什么我将它们关闭。我写了一个更复杂的测试,我已经把它简化了,因为它仍然没有通过 TravisCI 中的基本测试。如果我捕获并记录了内部函数的错误,为什么嵌套 catch 语句是个坏主意?
-
您在
then和then(done, done)中使用了两个回调第二个回调是针对错误。除非您在第二次回电catch()中抛出,否则永远不会发生。使用 mocha 更容易将done排除在外,然后返回承诺。 -
@MarkMeyer 我可以理解返回承诺的理由,但是当返回 l.getObjects() - 它超时,这就是我转向完成的原因。我知道 l.getObjects 返回一个承诺,就好像我将 l.getObjects 设置为一个变量并记录它一样,它显示了承诺。我从直接返回承诺开始,然后转向 done(),因为我无法让它工作。
-
您需要确保从
it('Function oLab.GetObjects & oLab.Deploy', (done)中删除done。这就是它知道寻找承诺的方式。
标签: javascript node.js mocha.js chai