Polymer 存根元素在就绪函数中无效

Polymer 存根元素在就绪函数中无效,polymer,polymer-1.0,web-component-tester,Polymer,Polymer 1.0,Web Component Tester,使用Polymer 1.*和WCT,在测试我的元素时,我无法在ready函数中删除方法\u getSpComboBox()和\u getItems()。我在测试函数之外抛出了错误:this.\u getSpComboBox(…)。\u getItems不是函数 因为它在ready函数中,所以我需要使用WCT apistub而不是sinon.stub,因为后者需要我抓取元素,而在fixture()之前我不能这样做 有什么建议吗 原始代码: _getSpComboBox: function()

使用Polymer 1.*和WCT,在测试我的元素
时,我无法在
ready
函数中删除方法
\u getSpComboBox()
\u getItems()
。我在测试函数之外抛出了
错误:this.\u getSpComboBox(…)。\u getItems不是函数

因为它在ready函数中,所以我需要使用WCT api
stub
而不是
sinon.stub
,因为后者需要我抓取元素,而在
fixture()之前我不能这样做

有什么建议吗

原始代码:

  _getSpComboBox: function() {
    return Polymer.dom(this.$.veteran.root).querySelector('sp-combo-box');
  },

  ready: function() {
    if (this.editMode) {
      this._getSpComboBox()._getItems();
    }
    this.$.veteranNoAjax.read();
    this._setStyle();
  }
测试:


在编辑模式下编辑
之前(()=>{
将('sp-app')替换为('fake-sp-app');
存根('sp-ajax',{read:()=>entitiesMock});
const _getItems=()=>entitiesMock;
存根('sp-ventive',{u getSpComboBox:()=>\u getItems});

不幸的是,在Polymer1中测试ready是一种痛苦,或者至少我还没有找到一种没有奇怪副作用的简单方法。在附加存根/间谍后调用ready方法始终是一种选择,但正如我提到的,它可能会导致一些奇怪的问题。这在Polymer2中得到缓解,因为第一次调用就调用了ready为您的元素创建connectedCallback,这样您就可以创建元素,然后绑定您的间谍并手动添加以触发它,只是不要忘记在之后删除它


对于聚合元素中的DOM操作,您应该使用附加的生命周期,这将解决您的问题,正如我在上面提到的测试,但这也为您在将来节省了一个奇怪的潜在使用案例。由于ready只对元素的一个实例运行一次,因此如果该元素将在以后重新使用,相反,如果您将逻辑放在附加的生命周期中,如果该元素从DOM中删除,然后稍后再次添加到另一个位置,它将重新运行其逻辑以获取其新的子元素。

使用
fixture()
调用
attached
方法。在调用
fixture()
之前,我如何查询元素以附加间谍?据我所知,
fixture()
需要先打上戳记,以便我可以查询dom以附加存根。如果您使用的是fixture,您不能依赖spies/stubs,您只能观察代码的效果(当涉及附加测试时)如果需要使用spies和stub,则必须使用document.createElement,然后可以添加spies并手动附加到DOM,这将触发生命周期事件。另一方面,如果使用代码方法而不是模板方法,fixture方法需要两个参数,第一个是您正在创建的元素类型,第二个是第二个是模型,该模型旨在设置默认属性,但您可以替换方法吗?
<test-fixture id="sp-veteran">
  <template>
    <h2>edit veteran in edit mode</h2>
    <sp-app>
      <sp-toast></sp-toast>
      <sp-veteran edit-mode></sp-veteran>
    </sp-app>
  </template>
</test-fixture>

  before(() => {
      replace('sp-app').with('fake-sp-app');

      stub('sp-ajax', {read: ()=> entitiesMock});
      const _getItems = ()=> entitiesMock;
      stub('sp-veteran', {_getSpComboBox: ()=> _getItems});