Testing 在组件中调用异步服务之前,测试是否正确设置了值

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

我正在为Angular2应用程序编写单元测试,其中组件在初始化时调用异步服务以加载其数据。加载数据之前,应将
加载
标志设置为
,以显示微调器,然后在检索数据后将
加载
标志设置回

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));