【发布时间】:2020-02-28 13:05:22
【问题描述】:
我有一个 Angular 组件,MyComponent,它调用一个返回 Observable 的方法并订阅它,类似于
export class MyComponent {
someProperty;
constructor(service: MyService) {}
someButtonClicked() {
this.service.doStuffAsync().subscribe(
resp => this.someProperty = resp;
);
}
}
@Injectable()
export MyService {
doStuffAsync() {
// returns an Observable which notifies asychronously, e.g. like HttoClient.get(url)
}
}
我想测试 someButtonClicked() 方法,因此我创建了一个 MyServiceMock 类,我将其注入到测试中
export class MyServiceMock {
doStuffAsync() {
return of({// some object}).pipe(observeOn(asyncScheduler));
}
}
无论出于何种原因,我希望 MyServiceMock 的 doStuffAsync() 是异步的,因此使用了 observeOn(asyncScheduler)。
此时虽然我不知道如何测试someButtonClicked()。我尝试了不同的策略,例如以下
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{ provide: MyService, useClass: MyServiceMock },
]
}).compileComponents();
}));
let fixture: ComponentFixture<MyComponent>;
let component: MyComponent;
beforeEach(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('test someButtonClicked', async(() => {
component.someButtonClicked();
fixture.whenStable().then(() => {
expect(component.someProperty).toBeDefined();
});
}));
但由于 MyServiceMock 的 doStuffAsync() 异步,此操作失败。
所以我的问题是,哪个是测试订阅异步 Observable 的方法引起的副作用(即 someProperty 设置正确)的最佳策略。
【问题讨论】:
标签: angular rxjs angular-test angular-observable