如何测试是否在window.onerror上调用了函数

时间:2019-07-01 10:10:20

标签: javascript jasmine

如何使用Jasime测试在窗口对象的onerror事件期间是否调用了函数。

我有一个模块,它公开了几个功能

//errortracking.ts

export function reportError(
  msg,
  url,
  lineNo,
  columnNo,
  err,
  service,
  errorServer
) {
  const string = msg.toLowerCase();
  const substring = "script error";
  let error = new Error(`Unknown error`);

  if (string.indexOf(substring) > -1) {
    error = new Error(msg);
  } else if (err) {
    error = err;
  }
  const errorReport: { error: Error; params: { service: string } } = {
    params: { service },
    error
  };

  errorServer.notify(errorReport);
  return false;
}

然后在一个单独的模块中,将此功能设置为window.onerror

const { onerror } = window;
  window.onerror = function catchAll(...args) {
    onerror.apply(this, args);
    return reportError.apply(this, [...args, serviceLabel, errorServer]);
  };

如何在Jasmine中编写测试,以使我知道reportError始终称为window.onerror

1 个答案:

答案 0 :(得分:0)

您可以为reportError函数创建一个间谍,然后根据函数内部发生的事情callThrough进行调用,以编写实际的函数,编写一个不会意外写入的伪函数数据库,或者直接保留它。

在任何情况下,都可以使用间谍对象断言某个函数已被调用:

// Import the entire module so we can use `jasmine.spyOn`, which requires
// an object and a key inside that object, but cannot handle a function object

import * as Errors from 'errortracking.ts';
jasmine.spyOn(Errors, 'reportError');

// You can check whether the function was called at al
it("calls reportError when something fails", function() {
  const fail = 1 / 0;
  expect(Errors.reportError).toHaveBeenCalled();
});

// Or check whether the arguments are also correct
it("calls reportError with the correct arguments", function() {
  const fail = 1 / 0;
  expect(Errors.reportError).toHaveBeenCalledWith(/* specific arguments */);
});