Unit testing 测试组件时如何模拟管道
目前,我正在覆盖提供商以使用模拟服务,如下所示:Unit testing 测试组件时如何模拟管道,unit-testing,angular,angular2-testing,angular2-pipe,Unit Testing,Angular,Angular2 Testing,Angular2 Pipe,目前,我正在覆盖提供商以使用模拟服务,如下所示: beforeach(注入([TestComponentBuilder],(tcb:TestComponentBuilder)=>{ tcb.重写提供程序(AddFieldToObject下拉组件, [ 提供(ServiceA,{useClass:MockServiceA})), 提供(ServiceB,{useClass:MockServiceB})) ]) ... 我想对组件使用的管道做同样的事情。我尝试过,provide(PipeA,{us
beforeach(注入([TestComponentBuilder],(tcb:TestComponentBuilder)=>{
tcb.重写提供程序(AddFieldToObject下拉组件,
[
提供(ServiceA,{useClass:MockServiceA})),
提供(ServiceB,{useClass:MockServiceB}))
])
...
我想对组件使用的管道做同样的事情。我尝试过,
provide(PipeA,{useClass:MockPipeA})
和provide(PipeA,{useValue:new MockPipeA()})
,但两者都不起作用。您可以在测试床的声明中添加mockpipes:
TestBed.configureTestingModule({
声明:[
应用组件,
模拟钢管
],
...
MockPipe
需要具有原始名称的@Pipe
装饰器
从'@angular/core'导入{Pipe,PipeTransform};
@管道({name:'pipename'})
类MockPipe实现了PipeTransform{
变换(值:数字):数字{
//如果你想的话,在这里做事
返回值;
}
}
若要插入管道,请使用Dinistro的答案。若要监视管道,您可以使用以下内容进行补充:
let pipeSpy: jasmine.Spy;
beforeEach(() => {
TestBed.configureTestingModule...
pipeSpy = spyOn(MockPipe.prototype, 'transform');
};
it('should do whatever', () => {
doYourStuff();
expect(pipeSpy).toHaveBeenCalled();
}
将我的管道模拟成简单的类
export class DateFormatPipeMock {
transform() {
return '29.06.2018 15:12';
}
}
在我的规范文件中简单使用useClass
providers: [
...
{provide: DateFormatPipe, useClass: DateFormatPipeMock}
...
]
为我工作:-)您可以使用npm包,但您需要像下面这样导入它
从“模拟管道”导入{MockPipe};
之后,您需要做的就是在提供者中定义模拟管道
提供程序:[
{
提供:高光管,
useValue:MockPipe(HighlightPipe,()=>“mock”)
}
]
仅此而已。如果您想为模拟管道使用可重用的util函数,可以尝试以下选项:
导出函数mockPipe(选项:Pipe):Pipe{
常量元数据:管道={
name:options.name
};
返回管道(元数据)(类MockPipe{});
}
然后在TestBed声明数组中调用此函数:
TestBed.configureTestingModule({
声明:[
某些组件,
mockPipe({name:'myPipe'}),
模拟管道({name:'myOtherPipe'})
],
// ...
}).compileComponents();
通常,我们在模板中使用管道。以下是模拟管道的方法。请注意,管道的名称必须与模拟的管道相同
@Pipe({ name: 'myPipe' })
class MyPipeMock implements PipeTransform {
transform(param) {
console.log('mocking');
return true;
}
}
如果在声明中的组件模板中使用管道,则在配置TestingModule时需要包括管道。一种可能是使用管道,并按如下方式使用:
TestBed.configureTestingModule({
声明:[
测试组件,
模拟管道(实际管道,(…args)=>args[0]),
]
}).compileComponents();
MockPipe的第二个参数定义了转换函数为参数数组返回的内容。如果您在4个月内没有得到任何答案,那么这是不可能的。您知道这一点吗?@coblr不,不幸的是,这对我来说不是一个高优先级的问题,但我很快会用新的测试API再次尝试,也许有一个解决方法哦,有什么解决方案吗?我试图不声明原始管道,而是创建一个模拟管道并声明它。但不知怎么的,管道渲染结果总是显示一个空字符串“”@harunurhan你只需要模板中的管道吗?现在是2019年,我仍然在经历:(我期待“提供”工作正常。有没有办法使用Jasmine监视模拟管道?我正在尝试模拟翻译管道,并检查是否使用正确的翻译密钥调用了它。模拟管道应该是您以该名称注册的唯一管道。我错误地导入了管道名称来源的模块。这阻止了我的模拟管道重写其or原始实现。如果您正在模拟管道,您的模拟应该是您注册的唯一实例,不包括原始管道注册。“不包括原始管道注册”eesh,如果SUT的导入超出了您的控制,那么可能会很困难。另外请注意:如果您不需要mockpipe,您可以在原始管道上使用spyOn
,您如何使用此配置测试?非常好的通用模拟函数。谢谢!这对我很有效,但有人可以详细解释此返回语句吗?@Pommesloch返回语句是这只是在另一个响应中写入Dinistro所做操作的另一种方式。Pipe()
位在随后的类声明中被修饰。值得一提的是,这里对shohrukh的响应进行了一点增强,允许返回模拟管道数据。这可能有助于您可视化。``导出函数mockPipe `(选项:Pipe,mockReturn:any):Pipe{const元数据:Pipe={name:options.name};return Pipe(元数据)(类MockPipe实现PipeTransform{public transform=()=>mockReturn;});}``我在angular 11上,这似乎不起作用。他们可能在内部更改了什么。我得到了错误“TypeError:Cannot read property'call'of undefined”这在某一点上可能是一个很好的解决方案,但该项目已停止运行,多年未更新。它不适用于Angular 11。您也可以创建一个合法管道,并将其添加到您的测试床中的声明下,就像您应该做的那样。