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();
}
...
请告知如何开始解构此错误以便编写正确的测试。
答案 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[]>
推荐测试方法。
或者,您可以将MockApiService
和ApiService
折叠为单个级别,并针对预期行为进行其他断言(测试/模拟TodoService
后端的机制将取决于是否您使用Http
或Http
中的@angular/http
方法。