带有 promise 的 Mocha 单一测试失败并同时通过

Mocha single test with promises fails and passes at the same time

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

我正在使用 Bluebird Promise、mochachai-as-promisedsinon 以及 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 必须确定到底是什么失败了,并将尽最大努力记录失败,但这可能会导致有趣的事情,例如测试数量不正确或相同的测试被报告为失败和成功!