我正在尝试为Jasmine测试框架编写一个测试,该测试预计会出现错误。目前,我正在使用来自GitHub的Jasmine Node.js集成。

在我的Node.js模块中,我有以下代码:

throw new Error("Parsing is not possible");

现在我试着写一个测试,期望这个错误:

describe('my suite...', function() {
    [..]
    it('should not parse foo', function() {
    [..]
        expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
    });
});

我还尝试了Error()和其他一些变体,只是不知道如何使它工作。


当前回答

it('it should fail', async () => {
    expect.assertions(1);

    try {
        await testInstance.doSomething();
    }
    catch (ex) {
        expect(ex).toBeInstanceOf(MyCustomError);
    }
});

其他回答

我知道这是更多的代码,但你也可以这样做:

try
    Do something
    @fail Error("should send a Exception")
catch e
    expect(e.name).toBe "BLA_ERROR"
    expect(e.message).toBe 'Message'

对于CoffeeScript爱好者:

expect( => someMethodCall(arg1, arg2)).toThrow()

我用下面的代码替换了Jasmine的toThrow匹配器,它允许您匹配异常的name属性或其message属性。对我来说,这使得测试更容易编写,也不那么脆弱,因为我可以做到以下几点:

throw {
   name: "NoActionProvided",
   message: "Please specify an 'action' property when configuring the action map."
}

然后用下面的方法进行测试:

expect (function () {
   .. do something
}).toThrow ("NoActionProvided");

这让我可以稍后在不中断测试的情况下调整异常消息,而重要的是它抛出了预期的异常类型。

这是toThrow的替代物,允许这样做:

jasmine.Matchers.prototype.toThrow = function(expected) {
  var result = false;
  var exception;
  if (typeof this.actual != 'function') {
    throw new Error('Actual is not a function');
  }
  try {
    this.actual();
  } catch (e) {
    exception = e;
  }
  if (exception) {
      result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected) || this.env.equals_(exception.name, expected));
  }

  var not = this.isNot ? "not " : "";

  this.message = function() {
    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
      return ["Expected function " + not + "to throw", expected ? expected.name || expected.message || expected : " an exception", ", but it threw", exception.name || exception.message || exception].join(' ');
    } else {
      return "Expected function to throw an exception.";
    }
  };

  return result;
};

对我来说,发布的解决方案不起作用,它一直抛出这个错误:

错误:期望函数抛出异常。

我后来意识到,我期望抛出错误的函数是一个异步函数,并期望承诺被拒绝,然后抛出错误,这就是我在我的代码中所做的:

throw new Error('REQUEST ID NOT FOUND');

这就是我在测试中所做的,它起作用了:

it('Test should throw error if request not found', willResolve(() => {
    const promise = service.getRequestStatus('request-id');
        return expectToReject(promise).then((err) => {
            expect(err.message).toEqual('REQUEST NOT FOUND');
        });
}));

尝试使用匿名函数:

expect( function(){ parser.parse(raw); } ).toThrow(new Error("Parsing is not possible"));

您应该向expect(…)调用传递一个函数。你的错误代码:

// incorrect:
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));

实际上是试图调用parser.parse(raw),试图将结果传递给expect(…),