Angular 为什么我不能单元测试方法`getGoods():Promise<;好[]>;`(通过Http获取数据的服务)?
我有一个名为GoodsdatService的服务。它通过Http服务获取一些数据 建造商是:Angular 为什么我不能单元测试方法`getGoods():Promise<;好[]>;`(通过Http获取数据的服务)?,angular,unit-testing,http,typescript,asynchronous,Angular,Unit Testing,Http,Typescript,Asynchronous,我有一个名为GoodsdatService的服务。它通过Http服务获取一些数据 建造商是: constructor(private http: Http) {} 功能getGoods。它通过Http服务获取数据,获取方法: getGoods(): Promise<Good[]> { return this.http.get(this.goodsUrl) .toPromise() .then(response => response.jso
constructor(private http: Http) {}
功能getGoods
。它通过Http服务获取数据,获取方法:
getGoods(): Promise<Good[]> {
return this.http.get(this.goodsUrl)
.toPromise()
.then(response => response.json().data as Good[])
.catch(this.handleError);
}
getGoods
进行http调用,所以。代码如下:
const mockResponse = [
{id: 11, name: 'Mr. Nice'},
{id: 12, name: 'Narco'},
{id: 13, name: 'Bombasto'},
{id: 14, name: 'Celeritas'},
{id: 15, name: 'Magneta'},
{id: 16, name: 'RubberMan'},
{id: 17, name: 'Dynama'},
{id: 18, name: 'Dr IQ'},
{id: 19, name: 'Magma'},
{id: 20, name: 'Tornado'}
];
mockBackend.connections.subscribe((connection) => {
connection.mockRespond(new Response(new ResponseOptions({
body: JSON.stringify({data: mockResponse})
})));
});
因此,我进行了绿色测试。但是它们不能是绿色的,因为:expect(goods.toEqual([newgood()])代码>。结果必须是红色。无论如何,即使我将调试器放在中,那么成功函数(其中是我的两个期望值)IDE将在断点上停止,我将得到以下错误:
错误:未捕获(承诺中):TypeError:无法读取未定义的属性“length”
因此,尽管我用一些数据模拟真实的http请求,但我在成功处理程序中得到了未定义的
,我将其传递给然后getGoods
方法返回的promise
我的思考与研究
也许问题在于:
如果我把调试器放在那里,每次都会看到response.json().data
是未定义的。顺便说一下,这段代码触发两次(不是一次)。我认为这可以用rxjs(http.get)来解释,它返回的是可观察的,订阅不只是触发一次。如果我检查response.json()
value,它就是Promise。它被拒绝了。其中有一些错误
这是:
TypeError: Already read
at eval (eval at <anonymous> (http://localhost:9876/base/src/test.ts:56782:13), <anonymous>:1:10)
at http://localhost:9876/base/src/test.ts:56782:13
at ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1546:26)
at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvoke (http://localhost:9876/base/src/test.ts:55337:39)
at ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1545:32)
at Zone.run (http://localhost:9876/base/src/polyfills.ts:1296:43)
at http://localhost:9876/base/src/polyfills.ts:1972:57
at ZoneDelegate.invokeTask (http://localhost:9876/base/src/polyfills.ts:1579:31)
at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvokeTask (http://localhost:9876/base/src/test.ts:55361:39)
at ZoneDelegate.invokeTask (http://localhost:9876/base/src/polyfills.ts:1578:36)
在数据中显示正确的数据(数组)
问题是:我做错了什么
有什么想法吗?用body:JSON.stringify({data:mockResponse})
替换body:JSON.stringify(mockResponse)
谢谢你的回答!我更新了我的问题。我首先尝试了它(就像在文章中一样),但它不起作用。即使我像你说的那样更改代码,我也会得到相同的结果。我在github上更新了问题和src。这可能与我的问题有关:嗯……问题出现了,因为我忘记导入响应
类=(
...
.then(response => response.json().data as Good[])
...
TypeError: Already read
at eval (eval at <anonymous> (http://localhost:9876/base/src/test.ts:56782:13), <anonymous>:1:10)
at http://localhost:9876/base/src/test.ts:56782:13
at ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1546:26)
at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvoke (http://localhost:9876/base/src/test.ts:55337:39)
at ZoneDelegate.invoke (http://localhost:9876/base/src/polyfills.ts:1545:32)
at Zone.run (http://localhost:9876/base/src/polyfills.ts:1296:43)
at http://localhost:9876/base/src/polyfills.ts:1972:57
at ZoneDelegate.invokeTask (http://localhost:9876/base/src/polyfills.ts:1579:31)
at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvokeTask (http://localhost:9876/base/src/test.ts:55361:39)
at ZoneDelegate.invokeTask (http://localhost:9876/base/src/polyfills.ts:1578:36)
ngOnInit() {
this.goodsDataService.getGoods()
.then((data) => {
debugger;
})
}