使用promises失败异步测试用例

时间:2014-08-27 17:59:45

标签: 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(reason); });
  });
});

然而,从我能看到的内容中,没有任何类似fail调用的内容。并且我不能在异步错误情况下抛出异常,因为它没有被Jasmine捕获 - 所有我得到的是最终的通用超时。解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

除了修改Jasmine本身之外,简单的解决方案是围绕expectcustom matcher的组合创建一个包装器,使其失败并显示给定的消息。

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);
  });
});