Angular 为什么我不能单元测试方法`getGoods():Promise<;好[]>;`(通过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

我有一个名为GoodsdatService的服务。它通过Http服务获取一些数据

建造商是:

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;
    })
}