【发布时间】:2020-03-21 21:01:27
【问题描述】:
尊敬的社区...
我遇到了下面这个问题,感觉很简单,但是找不到解决办法……
我正在 Angular 中测试一个控制器类。这是具有大量依赖项的遗留代码,我只想编写一个单元测试不模拟所有依赖项。
我正在寻找模拟嵌套函数的解决方案,即我调用一个方法,并期望嵌套方法被成功调用,没有实际调用它。
一个样本...
my-controller.ts
export class MyController {
constructor () {}
public init() {
/* doStuff */
this.initializeMyObject();
}
private initializeMyObject(): void {
/* doOtherStuff */
}
}
my-controller.spec.ts
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']),如果我错了,请纠正我。
(这不是我正在寻找的答案的一部分,但如果存在一些第三方库,我会很高兴有建议并跟进。)
我们将不胜感激。 干杯。
【问题讨论】:
标签: angular unit-testing jasmine