带有 promise 的 Mocha 单一测试失败并同时通过
Mocha single test with promises fails and passes at the same time
我目前正在遗留系统中编写一些测试,对这里的测试结果感到困惑。
我在这里进行了 一个 测试,它按预期失败了,但 mocha 结果显示 1 passing
和 1 failing
。
我正在使用 Bluebird
Promise、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();
})
在 then 块之后,mocha 仍然声称通过了一项测试。该方法也只被调用一次,我只有一个正在使用的合成数据集。所以我不明白是什么告诉 mocha 这已经通过但失败了...
有什么想法吗?
此致,Vegaaaa
Return你的承诺,return你的承诺,return你的承诺。现在大家一起来念吧"Return, yoooooooour promise!"
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 通常没有用,而且在这里会完全有害。摩卡仍然需要使用你的承诺。
(通常不鼓励使用它,请参阅 here。)如果您没有 return 您的承诺,那么 Mocha 会将您的测试视为同步测试,并且很可能会成功,因为您的测试并没有真正测试任何东西同步。然后,如果您遇到异步失败,Mocha 必须确定到底是什么失败了,并将尽最大努力记录失败,但这可能会导致有趣的事情,例如测试数量不正确或相同的测试被报告为失败和成功!
我目前正在遗留系统中编写一些测试,对这里的测试结果感到困惑。
我在这里进行了 一个 测试,它按预期失败了,但 mocha 结果显示 1 passing
和 1 failing
。
我正在使用 Bluebird
Promise、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();
})
在 then 块之后,mocha 仍然声称通过了一项测试。该方法也只被调用一次,我只有一个正在使用的合成数据集。所以我不明白是什么告诉 mocha 这已经通过但失败了...
有什么想法吗?
此致,Vegaaaa
Return你的承诺,return你的承诺,return你的承诺。现在大家一起来念吧"Return, yoooooooour promise!"
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 通常没有用,而且在这里会完全有害。摩卡仍然需要使用你的承诺。
(通常不鼓励使用它,请参阅 here。)如果您没有 return 您的承诺,那么 Mocha 会将您的测试视为同步测试,并且很可能会成功,因为您的测试并没有真正测试任何东西同步。然后,如果您遇到异步失败,Mocha 必须确定到底是什么失败了,并将尽最大努力记录失败,但这可能会导致有趣的事情,例如测试数量不正确或相同的测试被报告为失败和成功!