Angular тестирование - Как протестировать наблюдаемую цепочку, в которой вызываются два сервиса? - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь проверить наблюдаемую цепочку, в которой вызываются 2 службы. Я пытаюсь проверить, вызваны ли обе службы ровно один раз. Поскольку обе службы возвращают наблюдаемые, я использую mergeMap для объединения вызовов, как вы можете видеть ниже:

app.component.ts

public aliceInChain(): void {
    this.serviceA
      .doSomething()
      .pipe(
        mergeMap(() => {
          return this.serviceB.doSomethingElse();
        })
      )
      .subscribe(r => {
        console.log(r);
      });
  }

В моем файле spe c у меня есть:

describe("AppComponent", () => {
  let fixture;
  let component;

  beforeEach(async(() => {
    const serviceASpy = jasmine.createSpyObj("serviceA", {
      doSomething: of()
    });

    const serviceBSpy = jasmine.createSpyObj("serviceB", {
      doSomethingElse: of()
    });

    TestBed.configureTestingModule({
      imports: [FormsModule],
      declarations: [AppComponent],
      providers: [
        { provide: ServiceA, useValue: serviceASpy },
        { provide: ServiceB, useValue: serviceBSpy }
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });



  fit("should call serviceA and serviceB", done => {

    component.aliceInChain();
    expect(component.serviceA.doSomething).toHaveBeenCalledTimes(1);


  });
});

Я могу убедиться, что первый сервис был вызван, но как я могу проверить, что второй был также? Возможно ли это, так как тестируемый метод недействителен?

1 Ответ

1 голос
/ 18 марта 2020

Вместо того, чтобы проверять, были ли вызваны службы, я бы проверял, что происходит в subscribe.

describe("AppComponent", () => {
  let fixture;
  let component;
  let serviceASpy;
  let serviceBSpy;

  beforeEach(async(() => {
    serviceASpy = jasmine.createSpyObj("serviceA", ['doSomething']);

    serviceBSpy = jasmine.createSpyObj("serviceB", ['doSomethingElse']);

    TestBed.configureTestingModule({
      imports: [FormsModule],
      declarations: [AppComponent],
      providers: [
        { provide: ServiceA, useValue: serviceASpy },
        { provide: ServiceB, useValue: serviceBSpy }
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  fit("should call serviceA and serviceB", done => {
    serviceASpy.doSomething.and.returnValue(of('hello')); // assuming doSomething returns an Observable<string>;
    serviceBSpy.doSomethingElse.and.returnValue(of('hello world')); // assuming doSomething else returns an Observable<string>
    component.aliceInChain();
    // not sure if the next two lines will work
    expect(component.serviceA.doSomething).toHaveBeenCalledTimes(1);
    expect(component.serviceB.doSomethingElse).toHaveBeenCalledTimes(1);
    // assert what should happen in the subscribe
    expect(console.log).toHaveBeenCalledWith('hello world');
    done();
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...