这很可能是一个基本的Javascript问题,但是我要询问的上下文是使用https://jestjs.io/的测试,因为这是我遇到的地方。
以下开玩笑的测试代码:
import React from 'react';
import {cleanup} from 'react-testing-library';
import 'jest-dom/extend-expect';
afterEach(cleanup());
test("Hello World", () => {});
// several other tests but they they are not relevant to this example and have been excluded to keep the question simple
导致以下错误:
TypeError: Cannot read property 'call' of undefined
at resolve (/tmp/node_modules/jest-jasmine2/build/queueRunner.js:38:11)
at Promise (<anonymous>)
at mapper (/tmp/node_modules/jest-jasmine2/build/queueRunner.js:31:21)
at Promise.resolve.then.el (/tmp/node_modules/p-map/index.js:46:16)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
如果在清理后删除括号,一切都会按预期进行
afterEach(cleanup);
经过一番阅读后,我了解到发生这种情况是因为我不了解方法调用与方法引用之间的区别。
但是,我的问题是-为什么错误消息/跟踪如此神秘?如何通过查看错误消息/跟踪来找出根本原因?我必须一次从测试中删除1条线,以找出引发错误的进攻线。是否有更好/系统的方法可以使错误消息/跟踪有意义?
答案 0 :(得分:0)
TypeError:无法读取未定义的属性“调用”
错误很可能意味着cleanup() === undefined
,而Jest试图调用afterEach
之类的fn.call()
函数,因为函数应该具有call
方法。
确保您使用的是最新的Jest版本,并考虑在Jest存储库中打开一个有关神秘堆栈跟踪的问题。在运行套件以提供更有意义的反馈之前,框架先验证afterEach
等参数是合理的。
答案 1 :(得分:0)
我相信,如果在没有定义匿名函数的情况下将函数传递给afterEach,则需要在没有调用括号的情况下传递它。
afterEach(cleanup)
就错误为何如此神秘的原因而言,Jest的内部人员可能希望将函数引用传递给afterEach
。在这种情况下,您传递的是运行cleanup()
的结果,因此不太可能具有call属性