我正在尝试测试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
。
也许只需要模拟出构造函数,但是我不确定该怎么做。
答案 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