gpt4 book ai didi

javascript - 如何通过 JavaScript 的 Jest 单元测试来监视某个函数是否已被使用?

转载 作者:行者123 更新时间:2023-12-03 02:32:36 25 4
gpt4 key购买 nike

当我尝试在导入的函数上设置 spy 时,我收到以下错误消息 TypeError: Cannot read property '_isMockFunction' of undefined

我不明白这段代码有什么问题

导入的函数如下所示导出

export
function myFn(){
let htmlEl = document.querySelector('html');
let el = document.querySelector('.target-el');
if(el){
el.addEventListener('click', myInternalFn, false);
}

function myInternalFn () {
isUserLoggedIn((isIn) => {
let logoutClassName = 'el--logout';
if (isIn) {
el.classList.remove(logoutClassName);
return;
}
el.classList.add(logoutClassName);
});
}

function isUserLoggedIn (fn) {
return fn(localStorage.getItem('userLoggedIn') === 'true');
}
}

document.addEventListener('DOMContentLoaded', () => {
myFn();
});

TDD:

    import { betSlip } from "../src/main/javascript/custom/betslip-dialog";

describe('Testing bet slip button (only on mobile)', function () {
let htmlEl;
let el;

beforeEach(() => {
document.body.innerHTML =
`
<html>
<div class="target-el"></div>
</html>
`;

myFn();
htmlEl = document.querySelector('html');


});

it('When el button has been clicked for the first time', done => {
jest.spyOn(myFn, 'myInternalFn');
myInternalFn.click();
expect(true).toBe(true);

done();
});

});

最佳答案

根据 Jest 文档 https://facebook.github.io/jest/docs/en/jest-object.html#jestspyonobject-methodname在你的代码中

jest.spyOn(myFn, 'myInternalFn');

myFn 需要是一个对象,而 myInternalFn 需要是该对象的属性。在当前实现中,myInternalFn 隐藏在 myFn 范围内,并且不暴露于外部。我建议您重写代码(如果可能)以使用任一原型(prototype):

myFn.prototype.myInternalFn = function myInternalFn () { ... }

//and in tests
jest.spyOn(myFn.prototype, 'myInternalFn');

或者直接分配给函数对象(对我来说不是最好的方法)

myFn.myInternalFn = function myInternalFn () { ... }

// and in tests
jest.spyOn(myFn, 'myInternalFn');

一个主要想法是 - 如果不公开暴露 myInternalFn,你就无法对其进行 spy 事件。

关于javascript - 如何通过 JavaScript 的 Jest 单元测试来监视某个函数是否已被使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48670861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com