Testing 在组件中调用异步服务之前,测试是否正确设置了值
我正在为Angular2应用程序编写单元测试,其中组件在初始化时调用异步服务以加载其数据。加载数据之前,应将Testing 在组件中调用异步服务之前,测试是否正确设置了值,testing,angular,asynchronous,jasmine,Testing,Angular,Asynchronous,Jasmine,我正在为Angular2应用程序编写单元测试,其中组件在初始化时调用异步服务以加载其数据。加载数据之前,应将加载标志设置为真,以显示微调器,然后在检索数据后将加载标志设置回假 ngOnInit() { this.reloadEmployees(this.filter); } reloadEmployees(filter: string) { this.loading = true; this.employeeService.getEmployees(filter).subscrib
加载
标志设置为真
,以显示微调器,然后在检索数据后将加载
标志设置回假
ngOnInit() {
this.reloadEmployees(this.filter);
}
reloadEmployees(filter: string) {
this.loading = true;
this.employeeService.getEmployees(filter).subscribe((results: Employee[]) => {
this.employees = results;
this.loading = false;
});
}
以下是我编写测试的方式:
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [EmployeeComponent],
imports: [FormsModule, SpinnerModule, ModalModule, TranslateModule.forRoot()],
providers: [
{ provide: EmployeeService, useValue: employeeServiceStub },
]
});
fixture = TestBed.createComponent(EmployeeComponent);
component = fixture.componentInstance;
let employeeService = fixture.debugElement.injector.get(EmployeeService);
spy = spyOn(employeeService, 'getEmployees').and.returnValue(Observable.of(testEmployees));
});
it('should start loading employees when the component is initialized', fakeAsync(() => {
fixture.detectChanges();
expect(component.loading).toEqual(true);
}));
我希望只有在我的测试中调用tick()
时才会运行服务的回调,但显然还是调用了它,因为组件。当我检查其值时,加载已经返回到false
。注意,如果我在组件的回调中将加载
设置回false的行注释掉,则测试通过
知道我应该如何测试它吗?Rx.Observable.of
似乎是同步的()。这就是为什么fakeAsync
wrapper不能使用它的原因
相反,您可以使用例如Observable.fromPromise(Promise.resolve(…)
就你而言:
spy = spyOn(employeeService, 'getEmployees').and.returnValue(
Observable.fromPromise(Promise.resolve(testEmployees)));
或者,您可以使用:
我已经在上准备了一个工作测试样本,尝试将expect(component.loading).toEqual(true)放在fixture.detectChanges()之前?只是一个想法。我不确定这是否有意义。但由于在ngOnInit中调用了reloadEmployees(),而触发ngOnInit的是detectChanges,所以这不起作用。这看起来很有希望(双关语),但令人难以置信的骇客,更何况我的IntelliJ找不到从何处导入承诺。是否有一种方法可以通过使用调度程序参数使成为可观察的.of()
异步的?(仍在阅读rxjs文档,但至今未找到任何内容)
import { Scheduler } from 'rxjs/Rx';
...
spy = spyOn(employeeService, 'getEmployees').and.returnValue(
Observable.of(testEmployees, Scheduler.async));