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。您也可以创建一个合法管道,并将其添加到您的测试床中的声明下,就像您应该做的那样。