如何通过 javascript 的 Jest 单元测试来侦测某个函数是否已被使用?
How spy whether a function has been used or not with Jest unit testing for javascript?
当我尝试对导入的函数设置监视时,我收到以下错误消息 TypeError: Cannot read 属性 '_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();
});
测试驱动开发:
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
scope 中,不暴露在外面。
我建议您重写代码(如果可能的话)以使用任一原型:
myFn.prototype.myInternalFn = function myInternalFn () { ... }
//and in tests
jest.spyOn(myFn.prototype, 'myInternalFn');
或者直接赋值给函数对象(对我来说不是最好的方式)
myFn.myInternalFn = function myInternalFn () { ... }
// and in tests
jest.spyOn(myFn, 'myInternalFn');
一个主要想法是 - 如果 public 不暴露 myInternalFn
你就不能监视它。
当我尝试对导入的函数设置监视时,我收到以下错误消息 TypeError: Cannot read 属性 '_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();
});
测试驱动开发:
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
scope 中,不暴露在外面。
我建议您重写代码(如果可能的话)以使用任一原型:
myFn.prototype.myInternalFn = function myInternalFn () { ... }
//and in tests
jest.spyOn(myFn.prototype, 'myInternalFn');
或者直接赋值给函数对象(对我来说不是最好的方式)
myFn.myInternalFn = function myInternalFn () { ... }
// and in tests
jest.spyOn(myFn, 'myInternalFn');
一个主要想法是 - 如果 public 不暴露 myInternalFn
你就不能监视它。