Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何嘲笑类的属性_Javascript_Jestjs_Mocking_Spyon - Fatal编程技术网

Javascript 如何嘲笑类的属性

Javascript 如何嘲笑类的属性,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

我不太会开玩笑,所以如果我的问题读错了,我很抱歉,我正在一个普通的JS类上对一个方法进行单元测试,该类引用了类属性“this.original_params”。通过阅读文档和许多其他Stackoverflow帖子,我仍然不知道我必须模拟哪些部分以及这样做的语法。我目前正在尝试测试输入值是否为空以及目标值是否来自this.original_params

// 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&amp;currency=USD&amp;cid=ROCK&amp;useMiles=&amp;checkin=11/12/21&amp;pageSize=15&amp;mapSize=13&amp;groupid=43285&amp;radius=5&amp;nights=3&amp;latitude=26.10879170000000&amp;map=&amp;longitude=-80.10643370000000&amp;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&amp;currency=USD&amp;cid=ROCK&amp;useMiles=&amp;checkin=11/12/21&amp;pageSize=15&amp;mapSize=13&amp;groupid=43285&amp;radius=5&amp;nights=3&amp;latitude=26.10879170000000&amp;map=&amp;longitude=-80.10643370000000&amp;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
      函数。因此,只要
      querySelector
      返回您想要的内容,并且您能够提供您想要的任何内容,那么我不明白您为什么需要模拟。这很有意义,谢谢!谢谢你的回复,虽然我很沮丧,我的错误现在看起来很明显,但我很高兴这与嘲笑无关。有一件事我很好奇,您可能能够回答——如果我想在构造函数中设置原始参数,那么这是否需要模拟?再次感谢您的帮助。@MattSartain,我在这里没有看到模拟的用例<代码>原始参数
    在构造函数中设置为空字符串。然后在
    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&amp;currency=USD&amp;cid=ROCK&amp;useMiles=&amp;checkin=11/12/21&amp;pageSize=15&amp;mapSize=13&amp;groupid=43285&amp;radius=5&amp;nights=3&amp;latitude=26.10879170000000&amp;map=&amp;longitude=-80.10643370000000&amp;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&amp;currency=USD&amp;cid=ROCK&amp;useMiles=&amp;checkin=11/12/21&amp;pageSize=15&amp;mapSize=13&amp;groupid=43285&amp;radius=5&amp;nights=3&amp;latitude=26.10879170000000&amp;map=&amp;longitude=-80.10643370000000&amp;destination=Austin, TX, USA');