Тестирование службы Angular: не удается найти имя 'asyncData' - PullRequest
0 голосов
/ 11 сентября 2018

Итак, я учусь тестировать сервисы в Angular и попытался скопировать приведенный ниже пример в Angular docs.

let httpClientSpy: { get: jasmine.Spy };
let heroService: HeroService;

beforeEach(() => {
  // TODO: spy on other methods too
  httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']);
  heroService = new HeroService(<any> httpClientSpy);
});

it('should return expected heroes (HttpClient called once)', () => {
  const expectedHeroes: Hero[] =
    [{ id: 1, name: 'A' }, { id: 2, name: 'B' }];

  httpClientSpy.get.and.returnValue(asyncData(expectedHeroes));

  heroService.getHeroes().subscribe(
    heroes => expect(heroes).toEqual(expectedHeroes, 'expected heroes'),
    fail
  );
  expect(httpClientSpy.get.calls.count()).toBe(1, 'one call');
});

Я попытался скопировать его буквально, но выдает следующую ошибку:

ОШИБКА в src / app / services / find-locals.service.spec.ts (17,38): ошибка TS2304: не удается найти имя 'asyncData'.

Может кто-нибудь помочь мне заменить это? Или сказать мне, где я мог сделать что-то не так в другом месте?

Вот тестовый файл, скопированный из документов Angular:

import {FindLocalsService} from './find-locals.service';

import {HttpClient, HttpClientModule} from '@angular/common/http';

let findLocalsService: FindLocalsService;
let httpClientSpy: { get: jasmine.Spy, post: jasmine.Spy };

beforeEach(() => {
  httpClientSpy = jasmine.createSpyObj('HttpClient', ['get', 'post']);
  findLocalsService = new FindLocalsService(<any> httpClientSpy, null);
});

it('should save location to server', function () {
  const expectedData: any =
    [{ id: 1, name: 'A' }, { id: 2, name: 'B' }];

  httpClientSpy.post.and.returnValue(asyncData(expectedData));

  findLocalsService.saveLocation('something').subscribe(
    data => expect(data).toEqual(expectedData),
          fail
  );

  expect(httpClientSpy.post.calls.count()).toBe(1, 'one call');
});

Вот сама услуга

@Injectable()

export class FindLocalsService {

    constructor(private http: HttpClient, private authService: AuthenticationService){}

    saveLocation(locationObj){
        return this.http.post(url + '/findLocals/saveLocation', locationObj);
    }

    getThreeClosestPlayers() {
        const userId = this.authService.currentUser().user._id;
        console.log('entered 3 closest service', userId);

        return this.http.get(url + '/findLocals/getThreeClosestPlayers/' + userId)
            .pipe(
              map((data: any) => data.obj),
              catchError(this.handleError)
              )
    }
}

Ответы [ 4 ]

0 голосов
/ 13 августа 2019

см. Наблюдаемый.синхронный поворот

Rx.Observable.of(1, 2, 3, Rx.Scheduler.async).subscribe(
    (val) => console.log(val)
);

console.log('first');
This will log out:

//first
//1
//2
//3

Тем не менее, приятно иметь of() синхронным по умолчанию. Просто используя of вы получите этот заказ:

  • expect1
  • нажмите
  • юг
  • завершить
  • expect2
* * Пример тысяча двадцать-одиной: * * 1 022
expect1()
of('hello').pipe(finalize(..),tap(..)).subscribe(..)
expect2()

если вы сделаете его асинхронным, я думаю, вы получите этот заказ:

  • expect1
  • expect2
  • нажмите
  • суб
  • завершить

когда я проектирую метод сервиса, обычно он возвращает наблюдаемое, даже если компоненту не нужны данные из сервиса, я могу вернуть Observable, используя (map (() => null)). Если мне нужно протестировать код в этой цепочке, я могу создать вспомогательный метод, который может быть вызван тестами.

0 голосов
/ 08 октября 2018

Если загрузить пример кода из угловых документов, вы найдете определение «asyncData» в разделе «Проверка> файл async-observable-helpers.ts».

0 голосов
/ 24 октября 2018

Я цитирую: https://angular.io/guide/testing

Асинхронная наблюдаемая была создана помощником asyncData.Помощник asyncData - это служебная функция, которую вам придется написать самостоятельно.Или вы можете скопировать его из примера кода:

testing / async-observable-helpers.ts

/** Create async observable that emits-once and completes
 *  after a JS engine turn */
export function asyncData<T>(data: T) {
  return defer(() => Promise.resolve(data));
}

Примечание: defer приходитот rxjs, то есть: import { defer } from 'rxjs';

0 голосов
/ 12 сентября 2018

Изменить эту строку:

httpClientSpy.get.and.returnValue(asyncData(expectedHeroes));

для использования оператора Observable ()

httpClientSpy.get.and.returnValue(of(expectedHeroes));

Это вернет наблюдаемую, на которую можно подписаться, и вернет ожидаемые герои. Если вы используете Angular 6, вы можете импортировать его напрямую из rxjs:

import {of} из 'rxjs'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...