茉莉花;Angular:模拟被测试类的嵌套方法
荣誉社区 我面临以下问题,感觉很简单,但我找不到解决办法 我正在用Angular测试一个控制器类。它是具有大量依赖项的遗留代码,我只想编写一个单元测试,而不模拟所有依赖项 我正在寻找模拟嵌套函数的解决方案,即调用一个方法,并期望成功调用嵌套方法,而不实际调用它 一个样本 我的控制器。ts茉莉花;Angular:模拟被测试类的嵌套方法,angular,unit-testing,jasmine,Angular,Unit Testing,Jasmine,荣誉社区 我面临以下问题,感觉很简单,但我找不到解决办法 我正在用Angular测试一个控制器类。它是具有大量依赖项的遗留代码,我只想编写一个单元测试,而不模拟所有依赖项 我正在寻找模拟嵌套函数的解决方案,即调用一个方法,并期望成功调用嵌套方法,而不实际调用它 一个样本 我的控制器。ts export class MyController { constructor () {} public init() { /* doStuff */ this.initi
export class MyController {
constructor () {}
public init() {
/* doStuff */
this.initializeMyObject();
}
private initializeMyObject(): void {
/* doOtherStuff */
}
}
describe('MyController', () => {
let controller: MyController;
configureTestSuite(() => {
TestBed.configureTestingModule({
schemas: [NO_ERRORS_SCHEMA],
imports: [/*.. module imports ..*/],
providers: [ MyController ],
});
});
beforeEach(() => {
controller = TestBed.get(MyController);
});
it('completion should be called', () => {
// arrange
spyOn(controller, 'initializeMyObject');
// act
controller.init();
// assert
expect(controller.initializeMyObject).toHaveBeenCalled();
});
});
我的控制器规范ts
export class MyController {
constructor () {}
public init() {
/* doStuff */
this.initializeMyObject();
}
private initializeMyObject(): void {
/* doOtherStuff */
}
}
describe('MyController', () => {
let controller: MyController;
configureTestSuite(() => {
TestBed.configureTestingModule({
schemas: [NO_ERRORS_SCHEMA],
imports: [/*.. module imports ..*/],
providers: [ MyController ],
});
});
beforeEach(() => {
controller = TestBed.get(MyController);
});
it('completion should be called', () => {
// arrange
spyOn(controller, 'initializeMyObject');
// act
controller.init();
// assert
expect(controller.initializeMyObject).toHaveBeenCalled();
});
});
我知道我们通常不会模拟正在测试的类的方法,但我从其他编程语言(如Java)中知道它是有效的,我只是好奇如何做到这一点(此外,模拟所有嵌套依赖项将是一个总开销…)
我读过一些关于jasmine.createSpyObj的文章,但我怀疑解决方案是否会像jasmine.createSpyObj('this',['initializeMyObject']),如果我错了,请纠正我
(这不是我要寻找的答案的一部分,但如果存在一些第三方LIB,我很乐意提出建议并跟进。)
我们将不胜感激。
干杯。用Jasmine模拟单个类方法有不同的方法。这里有几个例子 当一个方法没有返回值(
void
返回类型)时
方法应返回给定值的时间
spyOn(object, 'method-name').and.returnValue(value);
当方法接受参数并应返回基于它们的计算值时
spyOn(object, 'method-name').and.callFake((p1, p2) => {
// compute value
return value;
});
但是我如何测试该方法是否真的被调用?如何验证:
expect(object.method name).toHaveBeenCalled()
?expect(object.method name).toHaveBeenCalled()
很好。您可以分享MyController.initi
和MyController.initializeMyObject
方法的全部内容吗?也许你在那里执行一些异步的工作。请你也考虑这个答案,因为你正在窥探一个私有的方法:我确实有一个异步时间函数,但是这个是被嘲笑的。在调用initializeMyObject
之前,我收到一个console.log输出,所以它肯定会到达那里spyOn
或MyController。prototype也未成功