React Jest测试与方法
React Jest测试与方法
我正在尝试为我React.Component类中定义的一个方法编写一个Jest测试。
class Math extends React.Component { constructor(props) { super(props); } sum(a, b){ return a+b; } export default Math;
在我的Jest文件中,我正在做如下操作:
import { Math } from './Math' describe('Math', () => { it('应该正确相加', () => { const result = Math.sum(10, 10); expect(result).toEqual(20); }
但是它给我一个错误提示:
TypeError: 无法读取未定义的属性'sum'
我应该如何解决这个问题?我尝试在网上找到解决方案,但没有找到。
问题的原因是你将Math.sum(x,y)
作为静态函数而不是对象引用使用。
你可以将函数改为:
static sum(a, b){ return a + b; }
对象引用要求你通过构造函数传递变量或通过函数动态分配它们。
let x, y; class Math { //构造函数具有默认值为0的可选参数。 constructor(first=0, second=0){ this.x = first; this.y = second; } //使用通过构造函数传递的变量进行求和。 sum(){ return x+y; } //设置x的值 changeX(num){ x = num; } //返回x的值 getX(){ return x; } //此函数事先保存到对象中,以便稍后检索。 sumSaved(first, second){ this.x = first; this.y = second; return x + y; } //通过构造函数分配。 let foo = new Math(first:1,second:2); foo.sum(); //返回3,因为1+2=3 foo.changeX(2); foo.sum(); //返回4,因为2+2=4 //通过函数分配。 let bar = new Math(); bar.sumSaved(4,6); //返回10并覆盖变量。 bar.getX(); //返回4,因为你之前保存过。
关于静态函数的信息,请参见这里。
关于何时使用静态函数,请参见这里。
另外,关于默认导出的信息,请阅读这里。
好了,但是将来我打算在静态方法中添加这个实例,而在静态方法中无法访问this,因此一直在寻找更好的解决方法。
在使用React Jest进行测试时,出现了"React Jest test with method"的问题。问题的原因是在导入模块时,使用了命名导入方式,而实际上被导出的是一个默认导出。此外,问题还出在使用了类的方法sum
,但是却将其当作类的静态方法来使用,而不是类的实例方法。
解决这个问题的方法是,将导入方式改为默认导入方式,或者将导出方式改为命名导出方式。同时,需要将类的方法sum
改为实例方法,而不是静态方法。
代码示例:
// 导入模块时使用默认导入方式 import MyClass from './MyClass'; // 或者将导出方式改为命名导出方式 // import { MyClass } from './MyClass'; // 创建类的实例 const myInstance = new MyClass(); // 调用实例方法 myInstance.sum();
这样就可以正确地使用React Jest进行测试,并解决"React Jest test with method"的问题了。