Javascript 测试子类的方法

Javascript 测试子类的方法,javascript,jestjs,es6-class,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) {

我试图测试类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;
测试尝试(如下所示):

这会产生错误
TypeError:无法读取未定义的
的有关A的构造函数的属性“bind”

也许有必要只模拟构造函数,但我不确定如何做到这一点。

以下是解决方案:

文件夹结构:

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

从“/B”导入B;
从“/util”导入{Y};
导出默认类A扩展B{
构造函数(){
超级('/A');
这是setCors(“”);
this.app.post(“”,this.X.bind(this));
}
公共X(需求、资源){
Y();
}
}
B.ts

导出默认类别B{
公共应用程序={
post(路由:字符串,控制器:()=>any){
//
}
};
私有名称:字符串=“”;
私有url:string='';
构造函数(名称:string){
this.name=名称;
}
受保护的setCors(url:string){
this.url=url;
}
}
util.ts

导出函数Y(){
console.log(“我是Y”);
}
A.spec.ts

从“/A”导入A;
从“/util”导入{Y};
jest.mock('./util.ts',()=>{
返回{
Y:jest.fn()
};
});
常数a=新的a();
描述('A',()=>{
它('应该正确执行函数Y',()=>{
常量mockedReq={};
常量mockedRes={};
a、 X(mockedReq,mockedRes);
期望(Y)到催收时间(1);
});
});
具有100%覆盖率报告的单元测试结果:

PASS src/stackoverflow/52075711/A.spec.ts(5.747s)
A.
✓ 应正确执行功能Y(8ms)
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
A.ts | 100 | 100 | 100 | 100 ||
B.ts | 100 | 100 | 100 | 100 ||
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:9.623s,估计14s

源代码:

您用于
模拟实现的东西
看起来不像
,因此我怀疑
a
首先应该能够
扩展它。这是一种基于Jest文档模拟类的推荐方法。它也是为了模拟构造函数,模块工厂必须返回构造函数。注意:箭头功能不起作用“。页面顶部的第一个示例似乎有点可疑。据我所知,这只是用于外部功能。而且,它似乎已经几乎正确地模拟了它,因为直到构造函数的第三行测试才失败。也许您正在使用一个混乱模式下的transpiler,这会扰乱ES6语义?在任何情况下,您的“构造函数”都是返回普通对象的箭头函数,而不是从
a.prototype
继承
X
方法的任何东西,这就是
a
构造函数失败的原因(忽略
extensed
super
不能与箭头函数一起使用)。
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();
});