在Angular 8中,我们可以使用Jasmine和Karma进行单元测试。在测试组件时,有时我们需要模拟一个未渲染到DOM中的ngOnInit
Promise值。以下是一个解决方案的示例代码:
首先,假设我们有一个组件叫MyComponent
,其中有一个ngOnInit
方法,该方法返回一个Promise对象。
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-my-component',
template: ''
})
export class MyComponent implements OnInit {
ngOnInit() {
return new Promise(resolve => {
setTimeout(() => {
resolve('Promise resolved');
}, 1000);
});
}
}
接下来,我们将编写一个单元测试来测试MyComponent
的ngOnInit
方法。
import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { MyComponent } from './my-component.component';
describe('MyComponent', () => {
let component: MyComponent;
let fixture: ComponentFixture;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MyComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should resolve the promise returned by ngOnInit', async(() => {
spyOn(component, 'ngOnInit').and.callThrough();
fixture.whenStable().then(() => {
expect(component.ngOnInit).toHaveBeenCalled();
expect(component.ngOnInit()).toEqual(jasmine.any(Promise));
component.ngOnInit().then((result) => {
expect(result).toBe('Promise resolved');
});
});
}));
});
在上述代码中,我们首先使用spyOn
函数来监视ngOnInit
方法,然后使用fixture.whenStable().then()
来等待Promise对象被解析。然后,我们可以断言ngOnInit
方法已被调用,并且返回的是一个Promise对象。最后,我们使用.then()
来验证Promise对象是否已被成功解析,并且返回值为'Promise resolved'。
通过运行上述测试,我们可以确保ngOnInit
方法返回的Promise值得到了正确的解析。
希望对你有所帮助!