Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 我如何通过服务的测试套件将不同的依赖项模拟注入到服务中?_Angular_Unit Testing_Jestjs - Fatal编程技术网

Angular 我如何通过服务的测试套件将不同的依赖项模拟注入到服务中?

Angular 我如何通过服务的测试套件将不同的依赖项模拟注入到服务中?,angular,unit-testing,jestjs,Angular,Unit Testing,Jestjs,在测试Angular服务(具有其自身的依赖项)时,我经常发现自己在测试套件中测试快乐路径和悲伤路径时陷入困境 我的意思是我有这项服务: 导出类MyService{ 构造函数(私有MyClient){} 公共doIt(){ 返回此.myClient.doTheThing()管道( catchError(错误=>{ //错误处理逻辑 }), //处理响应 ) } } 现在我想测试MyService#doIt当MyClient#doTheThing成功运行并返回该请求的响应/结果的可观察值时,以及M

在测试Angular服务(具有其自身的依赖项)时,我经常发现自己在测试套件中测试快乐路径和悲伤路径时陷入困境

我的意思是我有这项服务:

导出类MyService{
构造函数(私有MyClient){}
公共doIt(){
返回此.myClient.doTheThing()管道(
catchError(错误=>{
//错误处理逻辑
}),
//处理响应
)
}
}
现在我想测试
MyService#doIt
MyClient#doTheThing
成功运行并返回该请求的响应/结果的可观察值时,以及
MyClient#doTheThing
失败和错误时(因为我在
catchError
中有一些逻辑需要测试)

测试快乐之路非常简单:

//MyClientMock是MyClient的一个模拟实现,它返回一个固定结果
//例如,这样我可以在运行测试时针对这些值进行测试。
描述(MyService,()=>{
让服务:MyService
在每个之前(()=>{
TestBed.configureTestingModule({
供应商:[
我的服务,
{提供:MyClient,useClass:MyClientMock}
],
})
service=TestBed.inject(MyService)
})
它('做事情',(完成)=>{
service.doIt().subscribe(结果=>{
期望(结果)。toEqual(‘某物’)
完成()
})
})
})
但是当
MyClient
抛出错误时,如何测试sad路径,并确保
catchError
中的逻辑符合我的预期

我考虑创建另一个
MyClientMock
并将其命名为
myclienterormock
,它将抛出。但是我不能注入它,因为它在测试开始时就已经设置好了,它会干扰其他测试用例

在这种情况下,什么样的模式可以用来测试依赖项出错或成功时会发生什么?

我强烈建议不要使用Karma

当需要重新创建模拟函数的复杂行为以使多个函数调用产生不同的结果时,请使用mockImplementationOnce方法:

const myMockFn = jest
  .fn()
  .mockImplementationOnce(cb => cb(null, true))
  .mockImplementationOnce(cb => cb(null, false));

myMockFn((err, val) => console.log(val));
// > true

myMockFn((err, val) => console.log(val));
// > false
下面是模拟的另一个示例,它根据条件参数生成结果:

import { when } from 'jest-when';

const fn = jest.fn();
when(fn).calledWith(1).mockReturnValue('hello world!');

const result = fn(1);
expect(result).toEqual('hello world!');

我想说,与因果报应相比,玩笑的最大优势在于其不神秘、直截了当的错误消息,让您一眼就能确定测试失败的根本原因。

谢谢,这很有帮助!