Почему тест подтверждает прохождение подписки, не находясь в асинхронной зоне? - PullRequest
0 голосов
/ 19 февраля 2019

При запуске тестов в Angular2 + с использованием Karma и Jasmine и подписке на наблюдаемые, эта подписка (как я понимаю) запускается асинхронно, поэтому тест должен быть заключен в async или fakeAsync.

Но мы не используем async, а не fakeAsync, тесты пройдены, поэтому мой вопрос: разве код в subscribe раньше был асинхронным?Почему тест пройден?Что происходит?

hello.component.ts

import { Component, Input, OnInit } from '@angular/core';
import {of} from 'rxjs';

@Component({
  selector: 'hello',
  template: `<h1>Hello {{name}}!</h1>`,
  styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent implements OnInit  {
  name: string;

  ngOnInit() {
    // Subscribing to sayName() to get a name
    this.sayName().subscribe(name => this.name = name);
  }

  sayName() {
    return of('Foo');
  }
}

hello.component.spec.ts

import { CommonModule } from '@angular/common';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import {HelloComponent} from './hello.component';

describe('HelloComponent', () => {
  let fixture: ComponentFixture<HelloComponent>;
  let component: HelloComponent;


  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        CommonModule
      ],
      declarations: [HelloComponent],
      providers: [
      ]
    })
    .compileComponents();
  }));

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

  it('should create', () => {
    expect(component).toBeTruthy();
  });

  it('should have foo name', () => {
    // Running out of async/fakeAsync
    // and asserting we got the name
    expect(component.name).toEqual('Foo');
  });
});

Вы также можете проверить Stackblitz этот пример.

1 Ответ

0 голосов
/ 19 февраля 2019

subscribe() - синхронный вызов.В вашем случае во время этого звонка создается подписка, выдаются значения и вызывается наблюдатель.Опять же: все это происходит во время выполнения subscribe!

Когда вы создаете Observable с, например, interval(), значения будут передаваться асинхронно.Все до этого все еще происходит синхронно.

Когда вы используете оператор subscribeOn(), тогда даже подписка будет создаваться асинхронно.

В отличие от обещаний, реактивные потоки не являются асинхронными по умолчанию.И, как объяснялось ранее, различные части всего процесса могут быть независимо сделаны асинхронными.

Если вы хотите углубиться в эту тему, я беззастенчиво рекомендую мою статью Параллельность и асинхронное поведение с RxJS .Это коротко;)

...