首页 > 解决方案 > 测试子类的方法

问题描述

我正在尝试测试 A 类的方法 X 调用导入的函数 Y。A 类是 B 类的子类,应该模拟出来。

A 类如下所示:

const B = require('./B');
const { Y } = require('../util');
class A extends B {
  constructor() {
    super('/A');
    this.setCors('');
    this.app.post('', this.X.bind(this));
  }

  X(req, res) {
    Y();
  }
}

module.exports = A;

测试尝试(遵循Jest Official Docs):

const A = require('../path/to/A');
const B = require('../path/to/B');
jest.mock('../path/to/B', () => {
  return jest.fn().mockImplementation(() => {
    return { setCors: jest.fn(), app: { post: jest.fn() } };
  });
});

test('method X calls function Y', () => {
  (new A()).X();
  expect(Y).toBeCalled();
});

这给出了TypeError: Cannot read property 'bind' of undefined关于 A 的构造函数的错误。

也许有必要只模拟构造函数,但我不知道该怎么做。

标签: javascriptjestjses6-class

解决方案


这是解决方案:

文件夹结构:

.
├── A.spec.ts
├── A.ts
├── B.ts
└── util.ts

A.ts

import B from './B';
import { Y } from './util';

export default class A extends B {
  constructor() {
    super('/A');
    this.setCors('');
    this.app.post('', this.X.bind(this));
  }

  public X(req, res) {
    Y();
  }
}

B.ts

export default class B {
  public app = {
    post(route: string, controller: () => any) {
      //
    }
  };
  private name: string = '';
  private url: string = '';
  constructor(name: string) {
    this.name = name;
  }

  protected setCors(url: string) {
    this.url = url;
  }
}

util.ts

export function Y() {
  console.log('I am Y');
}

A.spec.ts

import A from './A';
import { Y } from './util';

jest.mock('./util.ts', () => {
  return {
    Y: jest.fn()
  };
});

const a = new A();

describe('A', () => {
  it('should execute function Y correctly', () => {
    const mockedReq = {};
    const mockedRes = {};
    a.X(mockedReq, mockedRes);
    expect(Y).toBeCalledTimes(1);
  });
});

具有 100% 覆盖率报告的单元测试结果:

PASS  src/stackoverflow/52075711/A.spec.ts (5.747s)
  A
    ✓ should execute function Y correctly (8ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 A.ts     |      100 |      100 |      100 |      100 |                   |
 B.ts     |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        9.623s, estimated 14s

源代码:https ://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/52075711


推荐阅读