angular - 由于打字,角度单元测试的模拟 Http 获取服务请求失败
问题描述
我再次尝试为 http get 请求编写测试,但由于数据类型而失败(至少这是我怀疑的)。
我要测试的请求有效,看起来像这样
getTypeFilter(): Observable<Typefilter[]> {
const url = this.endpoint.getEndpoint() + 'testdata/types?language=' + this.language;
return new Observable<Typefilter[]>(observer => {
this.httpc.get<any[]>(url).subscribe(
(data) => {
const resultData: Typefilter[] = [];
for (const item of data) {
resultData.push(new Typefilter(item.id, item.name));
}
observer.next(resultData);
observer.complete();
},
);
});
}
我的测试文件的摘录看起来像这样
import { TestBed } from '@angular/core/testing';
import { DataService } from './data.service';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { UrlService } from 'src/app/_services/url.service';
import { Typefilter } from '../_classes/typefilter';
describe('DataService', () => {
let httpMock: HttpTestingController;
let service: DataService;
let urlService: UrlService;
let mockType: Typefilter;
mockType = {id: 1, name: 'News'};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ HttpClientTestingModule]
});
httpMock = TestBed.inject(HttpTestingController);
service = TestBed.inject(DataService);
urlService = TestBed.inject(UrlService);
urlService.getEndpoint = () => ('http://someaddress/');
});
it('getTypeFilter - should return TypeFilter', () => {
service.getTypeFilter().subscribe((data) => {
expect(data).toEqual([mockType]);
});
const reqMock = httpMock.expectOne((req) => req.method === 'GET' && req.url === urlService.getEndpoint() + 'testdata/types?language=' + 'de');
expect(reqMock.request.method).toBe('GET');
reqMock.flush(mockType);
});
});
但它因 “TypeError:msgtypefilterkriterium is not iterable”而失败——我确实理解这一点,因为我在请求中收到的数据是一个对象数组,而我的模拟数据只是一个对象。但是当我将这些数据模拟为一个数组时,我确实得到了错误:'预期 $[0] 是一种对象,但类型过滤器({ id:1,名称:'News'})。 谁能帮我解决这个问题?
解决方案
mockType
是一个对象,而getTypeFilter
迭代响应for (const item of data)
。因此reqMock.flush
也应该使用数组。
尝试reqMock.flush([mockType]);
关于类型问题,可以这样修复:
service.getTypeFilter().subscribe((data) => {
expect(data).toEqual([new Typefilter(mockType.id, mockType.name)]);
});
推荐阅读
- selenium-webdriver - junit 断言等于
- python - 包含 SQL 查询的字符串中的变量 - Python
- android - 从 Fragment 到 onCreateView 的 MapsActivity 的意图
- c# - 在更新面板中选择和删除的完整回发
- angular - 'ElementRef' 仅指一种类型,但在此处用作值
- java - 如何使用 JAVA POI 写入列的数据以从输入 excel 输出 excel
- php - Woocommerce - 根据自定义字段值 (ACF) 禁用或隐藏产品
- android - 如何在viewpager中停止listview刷新
- java - glide 不从 sdcard 加载图像
- jquery - 如何改变一个状态或卸载文件,在使用按钮将文件选择为“未选择文件”后