我目前正在遗留系统中编写一些测试,对这里的测试结果感到困惑。我这里有一个测试,正如预期的那样失败了,但mocha显示为1 passing
和1 failing
。
我将Bluebird
Promises、mocha
、chai-as-promised
和sinon
与sinon-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必须决定到底是什么失败了,并会尽最大努力记录失败,但这可能会导致一些有趣的事情,比如测试次数不正确,或者同一测试被报告为失败和成功!