0

所以我有一个夹具:

<test-fixture id="my-element-fixture">
  <template>
    <my-element></my-element>
  </template>
</test-fixture>

我设置了用于测试的夹具:

<script>
  suite('my-element', () => {
    setup(() => {
      page = fixture('my-element-fixture');
    });

    test('testing', () => {
      assert.isTrue(true);
    });
  });
</script>

夹具的元素中有一个ready()功能:

constructor() {
        super();
      }
ready() {
        super.ready();
        this.otherElement.addEventListener('function_name', function(e) {
            //stuff
          }.bind(this)
        );
      }

这个ready()函数有一个对象调用它的元素:

this.otherElement

该对象在此夹具的父级中定义:

<my-element id="my-element" otherElement="[[$.otherElement]]"></my-element>

在那里创建为:

<otherElement id="otherElement></otherElement>

并从其文件中调用:

<link rel="import" href="../otherElement/otherElement.html">

我想做的就是不打扰测试otherElement

过去,当我在夹具中从另一个元素中获得一个元素时,我会简单地制作一个对象来代替它并使用假对象并制作假函数:

setup(() => {
  page = fixture('my-element-fixture');
  anotherElement = page.$.anotherElement;
  anotherElement.functionname = function(t) {/*do nothing*/};
});

但在过去,如您所见,该元素也在我正在测试的夹具元素中,因此page.$.anotherElement. 不确定这真的很重要。

现在的问题是我不知道我需要做什么来覆盖otherElement对象,以便它不会在ready()函数中被调用。

我试过在设置中做我上面做的事情。

我已经尝试将元素包含到实际的测试文件中。

我试过让夹具中的元素调用本身,一个假元素,实际元素。

几乎所有我能想到的。

每次对象未定义时,我都会收到“this.otherElement is undefined”或“Cannot read property of .functionname of undefined”之类的错误。

有任何想法吗?

4

2 回答 2

0

您应该能够将存根元素注入具有测试焦点的组件中。

setup(function() {
  replace('anotherElement').with('fakeAnotherElement');
});

鉴于您的模板

<test-fixture id="my-element-fixture">
  <template>
    <my-element></my-element>
  </template>
</test-fixture>

它会像

<my-Element>
 <fakeAnotherElement/>
</my-Element>

在文档中阅读更多内容: https ://www.polymer-project.org/3.0/docs/tools/tests#create-stub-elements

于 2018-08-03T05:40:25.953 回答
0

这很困难,但是在所有其他方法都失败之后,唯一的解决方案是在单元测试之外随意切入代码并更改结构,这样我的就绪函数就无法处理。

首先,我在准备函数的内容检查周围包裹了一个 if 语句,以查看 if 是否otherElement未定义:

constructor() {
        super();
      }
ready() {
        super.ready();
        if (this.otherElement != undefined) {
          this.otherElement.addEventListener('function_name', function(e) {
              //stuff
            }.bind(this)
          );
        }
      }

这绕过了在真正完成任何事情之前定义它的需要,并允许我otherElement像这样制作一个自定义对象。

page.otherElement = {};

然后根据需要将函数分配给对象:

page.otherElement = {
   functionName: function(parameters) {/*anything*/},
};

希望这对某人有所帮助,但它非常具体,所以 idk。GL 同胞聚合物伙伴!

于 2018-08-08T17:05:05.267 回答