承诺的Mocha单次测试失败,同时通过



我目前正在遗留系统中编写一些测试,对这里的测试结果感到困惑。我这里有一个测试,正如预期的那样失败了,但mocha显示为1 passing1 failing

我将BluebirdPromises、mochachai-as-promisedsinonsinon-chai一起用于间谍和存根。这是测试(我已经删除了理解我的问题所不需要的东西):

describe("with a triggerable activity (selection)", function () {
beforeEach(function stubData() {
stubbedTriggerFunction = sinon.stub(trigger, "newParticipation");
activityLibStub = ... // stub
selectionLibStub = ... // stub
fakeActivities   = ... // simple data with just ONE element
fakeSelection   = ... // simple data with just ONE element
// stub methods to return synthetic data
activityLibStub.returns(new Promise(function (resolve) {
resolve(fakeActivities);
}));
selectionLibStub.withArgs(1).returns(new Promise(function (resolve) {
resolve(fakeSelection);
}));
});
afterEach(function releaseStubs() {
// restore stubs...
});
it("should call the newParticipation function", function () {
var member = memberBuilder.buildCorrect();
trigger.allActivities(member)
.then(function () {
return expect(stubbedTriggerFunction).to.not.have.been.called;
})
.done();
})
});

此测试按预期失败,因为函数实际被调用。然而,摩卡告诉我,一次测试通过,一次失败。这是我在这个模块中实现的唯一测试。

我很确定这与承诺有关,但我似乎不知道它是什么

.catch(function(){
chai.assert.fail();
})

在那次封锁之后,摩卡仍然声称有一次测试通过了。该方法也只调用一次,我只有一个正在使用的合成数据集。所以我不明白是什么告诉摩卡,这已经过去了,但失败了。。。

有什么想法吗?

问候,Vegaaaa

还你的诺言,还你的承诺,还你你的承诺。让我们现在一起唱"回来,你的承诺!">

it("should call the newParticipation function", function () {
var member = memberBuilder.buildCorrect();
return trigger.allActivities(member)
.then(function () {
return expect(stubbedTriggerFunction).to.not.have.been.called;
});
})
});

我还删除了.done(),因为它对Bluebird通常没有用处,在这里会非常有害。Mocha还需要兑现你的承诺。(通常不鼓励使用它,请参阅此处。)如果你不兑现承诺,那么Mocha会将你的测试视为同步测试,而且很可能会成功,因为你的测试并没有真正同步测试任何。然后,如果你出现了非同步失败,Mocha必须决定到底是什么失败了,并会尽最大努力记录失败,但这可能会导致一些有趣的事情,比如测试次数不正确,或者同一测试被报告为失败和成功!

最新更新