Javascript 使用承诺的异步测试用例失败

Javascript 使用承诺的异步测试用例失败,javascript,jasmine,Javascript,Jasmine,我开始使用Jasmine对严重依赖承诺的JavaScript库进行单元测试。我需要异步使测试用例失败,并希望编写如下内容: describe("An async test suite", function () { it("should fail asynchronously", function (done, fail) { var promise = myLibraryCall(); promise.then(done, function(reason) { fail(r

我开始使用Jasmine对严重依赖承诺的JavaScript库进行单元测试。我需要异步使测试用例失败,并希望编写如下内容:

describe("An async test suite", function () {
  it("should fail asynchronously", function (done, fail) {
    var promise = myLibraryCall();
    promise.then(done, function(reason) { fail(reason); });
  });
});

然而,在我看来,没有什么能比得上
fail
调用了。我不能在异步错误的情况下抛出异常,因为Jasmine没有捕获到它——我得到的只是一个最终的通用超时。解决这个问题的最佳方法是什么?

除了修改Jasmine本身之外,简单的解决方案是围绕
expect
和给定消息的ToFail组合创建一个包装器

function endTestAfter(promise, done) {
  var customMatchers = {
    toFailWith: function () {
      return {
        compare: function (actual, expected) {
          return {
            pass: false,
            message: "Asynchronous test failure: " + JSON.stringify(expected)
          };
        }
      }
    }
  };
  jasmine.addMatchers(customMatchers);
  promise.done(done, function (reason) {
    expect(null).toFailWith(reason);
    done();
  });
}
这将产生以下测试套件代码:

describe("An async test suite", function () {
  it("should fail asynchronously", function (done, fail) {
    var promise = myLibraryCall();
    endTestAfter(promise, done);
  });
});