可以将“无限制方法”列入单元测试白名单吗?将来我是否有可能由于列入白名单而面临问题

时间:2019-12-02 07:06:12

标签: angularjs typescript tslint

示例:

class MyClass {
  public log(): void {
    console.log(this);
  }
}

unittests.js

const instance = new MyClass();
expect(instance.log).toHaveBeenCalled(); 

在尝试进行单元测试时,避免引用未绑定方法错误。使用箭头功能比在linting中添加“ whitelist”选项更好吗?任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

TypeScript对此进行了标记,因为您的原始函数引用了this。请注意,TypeScript不了解玩笑,也不了解(大概)您用来跟踪呼叫的模拟或间谍。

我解决这个问题的方法是命名该模拟并直接引用它,以便TypeScript和jest可以就该模拟的类型达成共识。

在您的示例中,在监视现有方法的地方,我们将间谍命名为:

const instance = new MyClass();
const logSpy = jest.spyOn(object, methodName);
expect(logSpy).toHaveBeenCalled();

在构建复杂的模拟程序的情况下,我们将使用其他命名的模拟程序来构建模拟程序:

const sendMock = jest.fn()
jest.mock('electron', () => ({
  ipcRenderer: {
    send: sendMock,
  },
}));
// ...
expect(sendMock).toHaveBeenCalledTimes(1);

答案 1 :(得分:0)

我也遇到了这个问题(开玩笑vs.打字稿-eslint)。 This是有问题的陪同规则。

我尝试了多种解决方案(围绕绑定模拟功能),尽管我仍然愿意寻找一种优雅的方法来静音掉毛规则,而又不会使测试的可读性显着降低,但我决定为测试禁用该规则

就我而言,我正在模拟电子ipcRenderer函数:

import { ipcRenderer } from 'electron';

jest.mock('electron', () => ({
  ipcRenderer: {
    once: jest.fn(),
    send: jest.fn(),
    removeAllListeners: jest.fn(),
  },
}));

然后在测试中,期望调用发送模拟:

expect(ipcRenderer.send).toHaveBeenCalledTimes(1);

直接绑定功能,例如

expect(ipcRenderer.send.bind(ipcRenderer)).toHaveBeenCalledTimes(1);

...通过了eslint规则,但开玩笑不喜欢它:

expect(received).toHaveBeenCalledTimes(expected)

Matcher error: received value must be a mock or spy function

Received has type:  function
Received has value: [Function bound mockConstructor]