测试子类的方法

时间:2018-08-29 10:54:48

标签: javascript jestjs es6-class

我正在尝试测试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();
});

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

也许只需要模拟出构造函数,但是我不确定该怎么做。

1 个答案:

答案 0 :(得分:0)

这是解决方案:

文件夹结构:

.
├── 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