受尊敬的社区...
我正面临以下问题,听起来很简单,但找不到解决方案...
我正在测试Angular中的Controller-Class。这是具有大量依赖关系的遗留代码,我只想编写一个 不模拟所有依赖关系的单元测试。
我正在寻找一种解决方案,模拟嵌套函数,即我调用一个方法,并期望嵌套方法被成功调用,没有实际调用它。< / p>
样本...
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();
});
});
我知道我们通常不模拟要测试的Class的方法,但是我从Java之类的其他编程语言中知道它可以工作,而且我很好奇如何做到这一点(除了事实之外,嵌套的依存关系将是总开销...)。
我已经阅读了有关jasmine.createSpyObj
的内容,但我怀疑解决方案是否会类似于jasmine.createSpyObj('this', ['initializeMyObject'])
,如果我错了,请纠正我。
(这不是我要寻找的答案的一部分,但是,如果存在某些第三方库,我将很高兴提出建议并采取后续行动。)
我们将不胜感激。 干杯。
答案 0 :(得分:0)
有多种方法可以用Jasmine模拟单个类的方法。这里有一些例子。
当方法没有返回值(void
返回类型)时。
spyOn(object, 'method-name').and.callFake(() => null);
方法应返回给定值时。
spyOn(object, 'method-name').and.returnValue(value);
该方法接受参数并应返回基于它们的计算值。
spyOn(object, 'method-name').and.callFake((p1, p2) => {
// compute value
return value;
});