Angular 我如何通过服务的测试套件将不同的依赖项模拟注入到服务中?
在测试Angular服务(具有其自身的依赖项)时,我经常发现自己在测试套件中测试快乐路径和悲伤路径时陷入困境 我的意思是我有这项服务:Angular 我如何通过服务的测试套件将不同的依赖项模拟注入到服务中?,angular,unit-testing,jestjs,Angular,Unit Testing,Jestjs,在测试Angular服务(具有其自身的依赖项)时,我经常发现自己在测试套件中测试快乐路径和悲伤路径时陷入困境 我的意思是我有这项服务: 导出类MyService{ 构造函数(私有MyClient){} 公共doIt(){ 返回此.myClient.doTheThing()管道( catchError(错误=>{ //错误处理逻辑 }), //处理响应 ) } } 现在我想测试MyService#doIt当MyClient#doTheThing成功运行并返回该请求的响应/结果的可观察值时,以及M
导出类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!');
我想说,与因果报应相比,玩笑的最大优势在于其不神秘、直截了当的错误消息,让您一眼就能确定测试失败的根本原因。谢谢,这很有帮助!