Javascript 模拟测试http-angular2

Javascript 模拟测试http-angular2,javascript,angular,http,testing,mocking,Javascript,Angular,Http,Testing,Mocking,我在这里读了很多问题和一些教程,但我仍然无法做到这一点,我已经逐字逐句地复制了教程,仍然没有运气,所以我不知道问题是什么。我对这东西还很陌生。这是我的密码: 从'@angular/core/testing'导入{TestBed,inject,async}; 从'@angular/http/testing'导入{MockBackend}; 进口{ BaseRequestOptions, HttpModule, Http,, 答复,, 回应 }来自“@angular/http”; 从“./item

我在这里读了很多问题和一些教程,但我仍然无法做到这一点,我已经逐字逐句地复制了教程,仍然没有运气,所以我不知道问题是什么。我对这东西还很陌生。这是我的密码:

从'@angular/core/testing'导入{TestBed,inject,async};
从'@angular/http/testing'导入{MockBackend};
进口{
BaseRequestOptions,
HttpModule,
Http,,
答复,,
回应
}来自“@angular/http”;
从“./items.service”导入{ItemsService};
从“/mock items”导入{MOCKITEMS};
描述('ItemsService',()=>{
在每个之前(()=>{
TestBed.configureTestingModule({
导入:[HttpModule],
提供者:[项目服务]
});
});
它('should construct',inject([ItemsService],(service)=>{
expect(service.toBeDefined();
}));
});
描述('ItemsService Mock',()=>{
在每个之前(()=>{
TestBed.configureTestingModule({
供应商:[
项目服务,
模拟后端,
BaseRequestOptions,
{
提供:Http,
useFactory:(后端,opts)=>新Http(后端,opts),
deps:[MockBackend,BaseRequestOptions]
}
],
导入:[HttpModule]
});
});
它('should construct',injection([ItemsService,MockBackend],(service,MockBackend)=>{
expect(service.toBeDefined();
}));
描述(“#getItems()”,()=>{
它('should return',inject([ItemsService,MockBackend],(service,MockBackend)=>{
常数mockresponse={
数据:[
{itemCharId:1,itemName:'milk'},
{itemCharId:2,itemName:'eggs'},
{itemCharId:3,itemName:'meat'}
]
}
mockBackend.connections.subscribe((连接)=>{
mockresponse(新响应(新响应选项({body:JSON.stringify(mockresponse)}));
});
service.getItems().subscribe((项目)=>{
期望(项目长度)为(3);
expect(items[0].itemName.toEqual('milk');
expect(items[1].itemName).toEqual('egs');
expect(items[2].itemName).toEqual('meat');
});
}));
});
});在中,服务方法返回
response.json().data

  getHeroes(): Promise<String[]> {
    return this.http.get('myservices.de/api/heroes')
        .toPromise()
        .then(response => response.json().data)
        .catch(e => this.handleError(e));
  }

此外,还可以使用

expect(items).toEqual(mockResponse);
在中,服务方法返回
response.json().data

  getHeroes(): Promise<String[]> {
    return this.http.get('myservices.de/api/heroes')
        .toPromise()
        .then(response => response.json().data)
        .catch(e => this.handleError(e));
  }

此外,还可以使用

expect(items).toEqual(mockResponse);

我想可能是太小了——我不认为缺少
服务
代码太小。它相当大。请提供所有相关代码。有必要了解您正在测试的内容。我想,在主Post中添加的服务代码可能太小了-我不认为缺少
服务
代码太小了。它相当大。请提供所有相关代码。有必要了解您正在测试的内容。在主要帖子中添加了服务代码谢谢您的帮助。我试过了,但还是失败了。实际的服务只是返回一个类似于上面列出的数组,所以我希望这是如何工作的。我不确定是什么问题。您希望
items
是数组,并且
mockResponse
也需要是数组(而不是具有
data
属性的对象)。那么它应该会起作用。实际上,您可以添加
expect(items).toEqual(mockResponse)
,因为这是真的,并且在断言失败的情况下会提供更好的反馈。我对webdev非常陌生,所以可能有一些非常明显的错误:)下面是使用toEqual的错误消息:
预期响应状态:null null null-null-for-URL:null-to-equal[Object({itemCharId:1,itemName:'milk')),Object({itemCharId:2,itemName:'Oggs'}),对象({itemCharId:3,itemName:'meat'})]。
这是否意味着我的getItems方法没有从api获取数据?当然,现在我看到了。我假设该服务在生产环境中工作正常,但它不能这样工作。你忘记调用
res.json()
。我更新了答案。您还需要将
rxjs/add/operator/map
放在
map
可观测运算符的服务文件中,才能使其正常工作。感谢您的帮助。我尝试过了,但仍然出现了相同的故障。实际的服务只会返回一个与上面列出的类似的数组,所以我希望通过这种方式获得正在工作。我不确定问题出在哪里。您希望
是数组,并且需要
mockResponse
也是数组(不是具有
数据
属性的对象)。然后它应该可以工作。实际上,您可以添加
预期(项)。toEqual(mockResponse)
,因为这是真的,并且在断言失败的情况下会提供更好的反馈。我对webdev很陌生,所以可能有一些非常明显的错误:)下面是使用toEqual的错误消息:
预期响应状态:null null null-null-for-URL:null-to-equal[Object({itemCharId:1,itemName:'milk'),Object({itemCharId:2,itemName:'eggs'}),Object({itemCharId:3,itemName:'meat'})]。
这是否意味着我的getItems方法没有从api获取数据?当然,现在我看到了。我假设服务在生产环境中工作正常,但它不能像那样工作。你忘记调用
res.json()
。我更新了答案。您还需要将
rxjs/add/operator/map
放在
map
可观察操作员的服务文件中,这样才能工作。