测试一个使用 .next 的简单服务,使用 Karma / Jasmin 在 Angular 4 中订阅



我的应用程序中有一个简单的服务,如下所示...

import {Injectable} from '@angular/core';
import {Observable} from 'rxjs/Observable';
import {Subject} from 'rxjs/Subject';
@Injectable()
export class WizardDialogNavigationService {
  public navAction$: Observable<any>;
  private navActionSubject: Subject<any> = new Subject();
  constructor() {
    this.navAction$ = this.navActionSubject.asObservable();
  }
  public navAction(action: string): void {
    this.navActionSubject.next(action);
  }
}

这不是最复杂的服务,它只是允许我在组件之间进行通信。现在我需要测试它,我不得不承认我对测试知之甚少。我只是想检查当WizardDialogNavigationService.navAction被称为navAction$ Observable包含传递的字符串时,所以我写了以下内容...

import {TestBed, inject, async} from '@angular/core/testing';
import {Observable} from 'rxjs/Rx';
import {expect} from 'chai';
import * as sinon from 'sinon';
import {WizardDialogNavigationService} from './wizard-dialog-navigation.service';
describe('WizardDialogNavigationService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [WizardDialogNavigationService]
    });
  })
  describe('navAction$ Observable', () => {
    let sut: WizardDialogNavigationService; // sut = Service Under Test
    beforeEach(inject([WizardDialogNavigationService], (service: WizardDialogNavigationService) => {
      sut = service;
    }));
    it('should be the last passed value', async(() => {
      const resultList = [];
      sut.navAction('TestString');
      sut.navAction$.subscribe((result) => resultList.push(result));
      console.log(resultList); // output is []
      expect(resultList.indexOf('TestString')).to.equal(0);
    }));
  });
});

我想我做错了,因为 resultList 数组不包含传递的值?就好像.next() .subscribe()没有被调用/运行一样。如果有人能告诉我哪里出错了,我将不胜感激。

>你需要一个BehaviorSubject,如果你直接subscribe它,它将返回已经存储的值。

因此,您可以将Subject更改为BehaviorSubject并订阅它,它将起作用。

医生:

https://github.com/ReactiveX/rxjs/blob/master/doc/subject.md#behaviorsubject

最新更新