如何对自定义元素进行单元测试,使用"构建"?

时间:2018-06-18 07:22:51

标签: javascript typescript aurelia aurelia-testing

我有一个简单的"工厂"元素如下所示。

<template>
    <compose repeat.for="segment of segments" 
             view-model.bind="segment.ViewModelClass"
             model.bind="segment.Model"></compose>
</template>

我正在尝试使用以下内容对此组件进行单元测试。

let component: ComponentTester<MyFactory> = StageComponent.withResources("MyFactory/MyFactory");
component.inView("<my-factory segments.bind='segments'></my-factory>")
         .boundTo({ segments })
         .create(bootstrap)
         ....

然而,当我这样做时,我得到以下DI错误。

  

错误:调用Compose时出错。检查内部错误以获取详细信息。

     

内部错误堆栈:   错误:索引为0的构造函数参数不能为null或未定义。您是否正在尝试注入/注册DI不存在的内容?       at Object.invokeWithDynamicDependencies(webpack-internal:///./node_modules/aurelia-dependency-injection/dist/native-modules/aurelia-dependency-injection.js:449:13)...

有人可能会说我正在测试一个代码(compose),这不是我的,并且已经过单元测试。但问题是,当我在my-factory中使用my-other-custom-element自定义元素时,由于相同的错误,仅使用my-factory会中断my-other-custom-element的所有测试用例。 my-factory的用法如下所示。

<template>
<require from="path/to/MyFactory"></require>
...
<my-factory segments.bind="segments"></my-factory>
...
</template>

这就是我需要修复此错误的原因。

这个错误似乎是因为compose的第一个ctor参数是DOM.Element,它由aurelia-pal初始化。并且似乎在测试时的初始化期间,正确初始化pal(并且按正确的顺序?)存在一些问题。有没有办法纠正这种情况?可能是使用手动处理的lifecyle?但是,由于我不确定如何继续,请建议。

1 个答案:

答案 0 :(得分:2)

现在已解决,问题是因为PLATFORM特定代码用来调整对Element类的引用,因此并未运行在所有其他代码上。相关讨论https://discourse.aurelia.io/t/solved-how-to-test-a-view-with-a-named-slot/680/

解决方案是确保只有在应用程序代码中调用平台初始化后,才能运行真实的测试代码。对于Aurelia而言,所有注入声明都已在静态inject()函数内部移动,因此不会再次发生。