我有一个简单的"工厂"元素如下所示。
<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?但是,由于我不确定如何继续,请建议。
答案 0 :(得分:2)
现在已解决,问题是因为PLATFORM特定代码用来调整对Element
类的引用,因此并未运行在所有其他代码上。相关讨论https://discourse.aurelia.io/t/solved-how-to-test-a-view-with-a-named-slot/680/
解决方案是确保只有在应用程序代码中调用平台初始化后,才能运行真实的测试代码。对于Aurelia而言,所有注入声明都已在静态inject()
函数内部移动,因此不会再次发生。