Свойство 'jasmineMatches' отсутствует в типе 'x' - PullRequest
0 голосов
/ 04 июня 2018

После ng test

Ожидаемый результат: я получаю удовлетворительное / неудачное выполнение x количества тестов.

Фактический выход:

ERROR in src/app/todo-data.service.spec.ts(19,45): error TS2345: Argument of type 'Todo[]' is not assignable to parameter of type 'Expected<Observable<Todo[]>>'.
  Type 'Todo[]' is not assignable to type 'ObjectContaining<Observable<Todo[]>>'.
    Property 'jasmineMatches' is missing in type 'Todo[]'.

В моем классе задач iУ меня нет свойства jasminematches, но это может не быть основной проблемой.

todo.ts:

export class Todo {
  id: number;
  title: string = '';
  complete: boolean = false;

  constructor(values: Object = {}) {
    Object.assign(this, values);
  }
}

todo-data.service.spec.ts

import {TestBed, async, inject} from '@angular/core/testing';
import {Todo} from './todo';
import {TodoDataService} from './todo-data.service';

...

  describe('#getAllTodos()', () => {

    it('should return an empty array by default', inject([TodoDataService],
      (service: TodoDataService) => {
      expect(service.getAllTodos()).toEqual(<Todo[]>[]);
    }));

...

todo-data.service.ts

import { Injectable } from '@angular/core';
import { Todo } from './todo';
import { ApiService } from './api.service';
import { Observable } from 'rxjs';

...

export class TodoDataService {

  constructor(private api: ApiService) { }

  getAllTodos(): Observable<Todo[]> {
    return this.api.getAllTodos();
  }

...

Посоветуйте, пожалуйста, как начать деконструкцию этой ошибки, чтобы написать правильный тест.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Я пришел к такому же выводу предыдущего постера.Ваше первоначальное тестовое утверждение сравнивает ожидающий запрос Http (представленный в виде наблюдаемого потока с одной наблюдаемой) с ожидаемым ответом пустого массива `Todo [] '.

В приведенном ниже фрагменте кода .subscribe метод активирует наблюдаемый поток.Помещение его в зону fakeAsync имитирует ход времени так же, как и асинхронный запрос Http.Поскольку тестовое утверждение находится внутри блока subscribe, теперь вы имеете дело с завершенным наблюдаемым потоком и можете получить доступ к содержимому потока, т. Е. Todo[].

it('should return an empty array by default', fakseAsync(inject([TodoDataService],
  (service: TodoDataService) => {
      service.getAllTodos().subscribe(success => {
        expect(success).toEqual(<Todo[]>)
      });
  ))
);

Одно поведение вваш тест, который я не совсем понимаю, заключается в том, что ваш TodoService, по-видимому, делегирует обработку Http на ApiService, который возвращает Observable<Todo[]>, а ваш TodoService также возвращает Observable<Todo[]>.Если между этими двумя службами существует значительный уровень абстракции, я бы предпочел метод тестирования с обозначением MockApiService в первоначальном ответе.

В качестве альтернативы вы можете свернуть свои ApiService и * 1021.* на один уровень и сделайте дополнительные утверждения об ожидаемом поведении (механизм тестирования / моделирования бэкэнда Http будет зависеть от того, используете ли вы методы Http в @angular/http или @angular/common/http).

0 голосов
/ 04 июня 2018

Ваша функция getAllTodos возвращает наблюдаемый, а не массив задач.Я думаю, именно поэтому возникает ошибка.Поэтому я думаю, что вы должны написать свой тест по-другому:

service.getAllTodos().subscribe(todos => {
  expect(todos).toEqual([])
});

Также (если вы еще этого не сделали) вы, вероятно, захотите предоставить заглушку (макет) для службы API.Вы должны протестировать эту службу в своем собственном файле.

В своем тестовом файле ниже опишите, но перед тем, как создать свой testBed (или в отдельном файле, из которого вы можете его импортировать):

const dummyTodos = [];

const mockApiService = {
  getAllTodos() {
    return Observable.of(dummyTodos);
  }
};

В свой TestBed.configureTestingModule добавьте строку:

providers: [{provide: ApiService, useValue: mockApiService}],

Вы также можете изменить значение dummyTodos в своих тестах, чтобы проверять различные ответы.

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