物业' jasmineMatches'缺少类型' x'

时间:2018-06-04 10:34:14

标签: angular testing jasmine-node

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[]'.

在我的todo课程中,我没有jasminematches属性,但这可能不是根本问题。

todo.ts:

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

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

待办事项-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[]>[]);
    }));

...

待办事项-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 :(得分:1)

你的getAllTodos函数返回一个observable而不是todos数组。我认为这就是发生错误的原因。因此,我认为您应该以不同的方式编写测试:

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的值以检查不同的响应。

答案 1 :(得分:1)

我得到了上一张海报的相同结论。您的初始测试断言是将待处理的Http请求(表示为具有单个observable的可观察流)与空的`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的{​​{1}}和Observable<Todo[]> }}也返回TodoService。如果这两个服务之间有一个有意义的抽象层,那么我将按照初始答案中概述的Observable<Todo[]>推荐测试方法。

或者,您可以将MockApiServiceApiService折叠为单个级别,并针对预期行为进行其他断言(测试/模拟TodoService后端的机制将取决于是否您使用HttpHttp中的@angular/http方法。