Angular 2模拟调用另一个服务的异步服务

Angular 2模拟调用另一个服务的异步服务,angular,testing,mocking,karma-jasmine,angular-promise,Angular,Testing,Mocking,Karma Jasmine,Angular Promise,我正在学习角度2测试(Karma,Jasmine)。我已经有了一个HTTP服务的工作测试,主要是从。我通过通常的异步(inject([MyService]),使测试正常工作 我的实际程序将服务包装在服务中,如下所示 @Injectable() export class GlobalsService { private options: Option[] = []; error: any; constructor(private optionService: OptionServic

我正在学习角度2测试(Karma,Jasmine)。我已经有了一个HTTP服务的工作测试,主要是从。我通过通常的异步(inject([MyService]),使测试正常工作

我的实际程序将服务包装在服务中,如下所示

@Injectable()
export class GlobalsService {
  private options: Option[] = [];
  error: any;

  constructor(private optionService: OptionService) { }

  public getGlobals(): void {
    let that = this;
    this.optionService
      .getOptions()
      .then(options => that.fillOptions(options))
      .catch(error => that.error = error);
  }
  [SNIP]
optionService.getOptions()返回一个等待的承诺,然后填充globalService.options列表。globalService.getGlobals()被同步调用或在其内容的异步(延迟)填充被隐藏的位置调用

export class AppComponent implements OnInit {
  constructor(private globalsService: GlobalsService) { }

  ngOnInit() {
    this.globalsService.getGlobals();
  }
  [SNIP]
我一直在研究如何在测试上下文中调用globalsService.getGlobals(),我想我应该通过async()调用它

到目前为止,我的模拟选项服务是:

@Injectable()
export class MockOptionService {
  constructor() { }

  getOptions(): Promise<Option[]> {
    let options: Option[] = [
      { id: 'NY' } // truncated property list
    ];
    return Promise.resolve(options);
  }

}
然而,我的“智能”程序员编辑器(SublimiteText)说“属性”then“在类型'void'上不存在”,这让我不确定是应该使用async(inject)还是只使用tick()

有人评论吗

谢谢, 杰罗姆。

试试这个

it('should get Option objects async',
async(inject([GlobalsService, MockOptionService], (globalsService: GlobalsService, optionService: OptionService) => {

  globalsService.getGlobals()
    .do(value => {
      expect(value.length).toBe(1);
    }).toPromise(); 
})));

经过反复研究,我发现了两件事: *我的测试是错误的。globalsService.getGlobals()返回void。then或.do表示“属性不存在”是正确的

为了使测试能够工作,我所做的更改是添加一个setup子句,将async(inject)更改为fakeAsync(inject),并修复注入和声明。以下是有效的方法:

describe('Globals Service', () => {

  beforeEach(() => {

    TestBed.configureTestingModule({
      providers: [
        { provide: OptionService, useClass: MockOptionService },
        { provide: GlobalsService, useClass: GlobalsService }
      ]
    });
  });

  fakeAsync(inject([GlobalsService, OptionService], (globalsService: GlobalsService,  optionService: OptionService) => {
      globalsService.getGlobals();
      tick();
      expect(globalsService.getOptions().length).toBe(1);
    })));

});
感谢大家的关注,感谢Nidhin的回复。现在我正在处理我的error()处理——即在handleError()中报告一个null错误变量。但这是另一个支持调用


杰罗姆。

没有改变任何事情。请看下面我的答案。
describe('Globals Service', () => {

  beforeEach(() => {

    TestBed.configureTestingModule({
      providers: [
        { provide: OptionService, useClass: MockOptionService },
        { provide: GlobalsService, useClass: GlobalsService }
      ]
    });
  });

  fakeAsync(inject([GlobalsService, OptionService], (globalsService: GlobalsService,  optionService: OptionService) => {
      globalsService.getGlobals();
      tick();
      expect(globalsService.getOptions().length).toBe(1);
    })));

});