为 TestBed 提供“entryComponents”
Posted
技术标签:
【中文标题】为 TestBed 提供“entryComponents”【英文标题】:Providing "entryComponents" for a TestBed 【发布时间】:2017-05-19 22:13:17 【问题描述】:我有一个组件,它接收组件的组件类以作为子项动态创建。
let componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentToCreate);
this.componentReference = this.target.createComponent(componentFactory);
我正在尝试编写一个单元测试并传递一些 TestComponent 以供它创建和渲染。
TestBed
.configureTestingModule(<any>
declarations: [MyAwesomeDynamicComponentRenderer, TestHostComponent],
entryComponents: [TestComponent],
);
因为configureTestingModule
期望TestModuleMetadata
没有entryComponents
,所以有强制转换为“任何”,但我收到错误:“没有为TestComponent 找到组件工厂”。
如何将entryComponents
提供给TestBed
?
【问题讨论】:
【参考方案1】:好的,我想通了。在测试中,您应该定义新模块,在其中声明模拟组件并将其指定为 entryComponent
。
@NgModule(
declarations: [TestComponent],
entryComponents: [
TestComponent,
]
)
class TestModule
并将其导入TestBed
TestBed
.configureTestingModule(
declarations: [ValueComponent, TestHostComponent],
imports: [TestModule],
);
希望对某人有所帮助:]
【讨论】:
如果 *** 能让你不止一次地为一个答案投票! 我更喜欢这个而不是接受的答案,因为它使用与我的生产代码用于导入 NgModules 的相同机制。我也不需要知道overrideModule
方法做什么或不做什么。
感谢您的回答,虽然老了。我的问题很相似,但我使用的是浅渲染器。我必须创建一个 testModule 并在那里提供一个入口组件,它在我正在编写的测试组件中使用。【参考方案2】:
如果你愿意,你也可以直接在你的测试文件中做:
import BrowserDynamicTestingModule from '@angular/platform-browser-dynamic/testing'; // DO not forget to Import
TestBed.configureTestingModule(
declarations: [ MyDynamicComponent ],
).overrideModule(BrowserDynamicTestingModule,
set:
entryComponents: [ MyDynamicComponent ],
);
【讨论】:
从'@angular/platform-browser-dynamic/testing'导入 BrowserDynamicTestingModule ;万一这对任何人都有帮助 我们如何覆盖当前的模块定义TestBed.configureTestingModule(...)
以包含 entryComponents?我们是否必须按照另一个答案中的建议创建 TestModule 才能做到这一点?
@Jessycormier 我不确定你的问题。这基本上就是我在示例中所做的:我正在调用 overrideModule 方法,并通过 set 键提供一个新的 entryComponents 数组。如果你有其他组件,你可以用它创建一个数组,然后像这样设置 entryComponents:entryComponents: [ ...myComponentArray, MyDynamicComponent ]
('...' 是 'Object.assign()' 的语法糖)
我认为这是解决这个问题的正确答案,应该接受。
我的 entryComponent 需要提供程序时出现 NullInjector 错误。以上是关于为 TestBed 提供“entryComponents”的主要内容,如果未能解决你的问题,请参考以下文章
Angular 7 TestBed.overrideProvider 不适用于 ActivateRoute
TestBed configureTestingModule 在一个模块中定义所有 spec.ts 通用的导入、声明、提供程序和管道 - 模式
使用 Testbed 的 Nativescript 测试不起作用
TestBed.get 和 new Service(...dependencies) 有啥区别
如何测试 angular 2 组件,其中嵌套组件具有自己的依赖项? (TestBed.configureTestingModule)