考虑测试的函数中是否有一些会修改 mocked 函数的行为的代码。可能的情况是您可能在函数中定义了一个 spy 来跟踪函数的调用或者改变了被 mocked 函数的返回值。
以下是一个可能导致该问题的示例代码:
function getUserName(userId) {
const result = getUserById(userId);
if (result) {
return result.name;
}
return 'Unknown';
}
test('getUserName should return Unknown if user does not exist', () => {
const getUserById = jest.fn();
getUserById.mockReturnValue(null);
expect(getUserName('test123')).toBe('Unknown');
});
在上面的代码中,我们使用 jest.fn()
创建了一个 mock 的 getUserById
函数,并在测试中重新定义其返回值为 null
。此时, lastMockCall 对象将会以 undefined 的形式返回,即使这个函数原本返回某个对象。 因此,在执行 result.name
时,将会引发一个类型错误,提示“Cannot read property 'name' of null”。要解决这个问题,需要修改上述测试代码:
function getUserName(userId) {
const result = getUserById(userId);
if (result && result !== null) { // 加入判断条件
return result.name;
}
return 'Unknown';
}
test('getUserName should return Unknown if user does not exist', () => {
const getUserById = jest.fn();
getUserById.mockReturnValue(null);
expect(getUserName('test123')).toBe('Unknown');
});
加入了一个条件,对 result
进行检查,以确保它不是 null
。这样可以防止引发类型错误,从而使测试通过。