Javascript 如何嘲笑类的属性
我不太会开玩笑,所以如果我的问题读错了,我很抱歉,我正在一个普通的JS类上对一个方法进行单元测试,该类引用了类属性“this.original_params”。通过阅读文档和许多其他Stackoverflow帖子,我仍然不知道我必须模拟哪些部分以及这样做的语法。我目前正在尝试测试输入值是否为空以及目标值是否来自this.original_paramsJavascript 如何嘲笑类的属性,javascript,jestjs,mocking,spyon,Javascript,Jestjs,Mocking,Spyon,我不太会开玩笑,所以如果我的问题读错了,我很抱歉,我正在一个普通的JS类上对一个方法进行单元测试,该类引用了类属性“this.original_params”。通过阅读文档和许多其他Stackoverflow帖子,我仍然不知道我必须模拟哪些部分以及这样做的语法。我目前正在尝试测试输入值是否为空以及目标值是否来自this.original_params // autocomplete.js export default class Autocomplete { constructor(site_c
// autocomplete.js
export default class Autocomplete {
constructor(site_config, page_name) {
this.site_config = site_config;
this.page_name = page_name;
this.lat = null;
this.lng = null;
this.original_params = '';
}
init() {
this.original_params = new URLSearchParams(document.querySelector('meta[name="originalParams"]').content);
}
getDestination(inputSelector) {
if (document.querySelector(inputSelector).getAttribute('value') !== '') {
return document.querySelector(inputSelector).value;
}
console.log(this.original_params.has('destination'));
if (this.original_params.has('destination')) {
return this.original_params.get('destination');
}
}
}
我试过多种方式写测试,但我不知道从哪里开始。以下是测试的当前迭代:
// autocomplete.test.js
it('Sets destination if it exists in Original Params', () => {
document.body.innerHTML = `<meta name="original_params" content="siteid=62309&currency=USD&cid=ROCK&useMiles=&checkin=11/12/21&pageSize=15&mapSize=13&groupid=43285&radius=5&nights=3&latitude=26.10879170000000&map=&longitude=-80.10643370000000&destination=Austin, TX, USA"><input type="search" id="address-input" placeholder="Destination" value="" required="true">`;
const original_params = new URLSearchParams(
'<meta name="original_params" content="siteid=62309&currency=USD&cid=ROCK&useMiles=&checkin=11/12/21&pageSize=15&mapSize=13&groupid=43285&radius=5&nights=3&latitude=26.10879170000000&map=&longitude=-80.10643370000000&destination=Austin, TX, USA"></meta>'
);
expect(autocomplete.getDestination('input#address-input')).toEqual('Austin, TX, USA');
});
非常感谢您的帮助。几件事:
- 您忘记在自动完成实例上调用
init()
- 在
init
中查找querySelector
但在测试中,您只有meta[name=“originalParams”]
在构造函数中设置为空字符串。然后在几件事:
- 您忘记在自动完成实例上调用
init()
- 在
init
中查找querySelector
但在测试中,您已经meta[name=“originalParams”]
在构造函数中设置为空字符串。然后在感谢您的回答,虽然我很沮丧,我的错误现在看起来很明显,但我很高兴它与模拟无关。有一件事我很好奇,您可能能够回答——如果我想在构造函数中设置原始参数,那么这是否需要模拟?再次感谢您的帮助。@MattSartain,我在这里没有看到模拟的用例<代码>原始参数
函数中进行更新。init
函数依赖于init
函数。因此,只要document.querySelector
返回您想要的内容,并且您能够提供您想要的任何内容,那么我不明白您为什么需要模拟。这很有意义,谢谢!谢谢你的回复,虽然我很沮丧,我的错误现在看起来很明显,但我很高兴这与嘲笑无关。有一件事我很好奇,您可能能够回答——如果我想在构造函数中设置原始参数,那么这是否需要模拟?再次感谢您的帮助。@MattSartain,我在这里没有看到模拟的用例<代码>原始参数querySelector
函数中进行更新。init
函数依赖于init
函数。因此,只要document.querySelector
返回您想要的内容,并且您能够提供您想要的任何内容,那么我不明白您为什么需要模拟。这很有意义,谢谢!querySelector
● getDestination › Sets destination if it exists in Original Params TypeError: this.original_params.has is not a function 80 | return document.querySelector(inputSelector).value; 81 | } > 82 | console.log(this.original_params.has('destination')); | ^ 83 | if (this.original_params.has('destination')) { 84 | return this.original_params.get('destination'); 85 | }
it('Sets destination if it exists in Original Params', () => { document.body.innerHTML = `<meta name="originalParams" content="siteid=62309&currency=USD&cid=ROCK&useMiles=&checkin=11/12/21&pageSize=15&mapSize=13&groupid=43285&radius=5&nights=3&latitude=26.10879170000000&map=&longitude=-80.10643370000000&destination=Austin, TX, USA"><input type="search" id="address-input" placeholder="Destination" value="" required="true">`; let autocomplete = new Autocomplete(); autocomplete.init(); expect(autocomplete.getDestination('input#address-input')).toEqual('Austin, TX, USA'); });
new URLSearchParams('siteid=62309&currency=USD&cid=ROCK&useMiles=&checkin=11/12/21&pageSize=15&mapSize=13&groupid=43285&radius=5&nights=3&latitude=26.10879170000000&map=&longitude=-80.10643370000000&destination=Austin, TX, USA');
- 您忘记在自动完成实例上调用