2017-08-08 50 views
0

我是Jasmine的新手,我试图编写一个简单的单元测试,检查我的方法是否返回预期值。这里是我的角度应用的方法:用Jasmine测试方法的可观察返回值

saveEvent(techEvent): Observable<IEvent>{ 

     let headers = new Headers({ 'Content-Type': 'application/json'}) 
     let options = new RequestOptions({headers: headers}) 

     return this.http.post('/api/events', techEvent, options) 
      .map((response: Response) => { 
       //have an updated copy of saved event 
       return response.json() 
      }).catch(this.handleError) 
} 

正如你可以看到,这是一个后方法节省了“techEvent”对象。这里是我试图在我的规范编写测试:

it('should save the event',() => { 

     var testEvent = { id: 7, name: "AngularJS"} 

     mockHttp.post.and.returnValue(Observable.of(false)) 

     techEventService.saveEvent(<IEvent>testEvent) 

     expect(techEventService.saveEvent).toBe(jasmine.any(Object)) 

    }) 

测试失败:(我的目标在这里是简单地测试该方法返回一个对象,并返回传递特定对象我不知道。如果我还可以测试它是否是JSON ...

回答

2

您的方法是异步的,这通常适用于Observables。您需要订阅来自techEventService.saveEvent的响应并验证变量是否在该范围内发生了更改订阅回调

此外,您正在测试techEventService.saveEvent是否是一个对象,但这绝对是对techEventService.saveEvent函数的引用。我相信你想测试服务器的响应是否是一个对象,这是在subscribe()回调中运行测试的另一个原因。

it('should save the event', (done) => { 

    var testEvent = { id: 7, name: "AngularJS"}; 

    mockHttp.post.and.returnValue(Observable.of(false)); 

    techEventService.saveEvent(<IEvent>testEvent).subscribe((response) => { 
     expect(response).toBe(jasmine.any(Object)); 
     done(); 
    }); 
}); 

因为这是异步,茉莉可能认为测试完成实际装载您的回调之前(甚至从来没有达到expect呼叫,并宣布测试合格,而不必运行它。)因此,你可以通过done进入您的测试,然后茉莉花不会考虑您的测试完成,直到您拨打done()回拨。

备注:习惯于在适当的时候用分号结束行。

+0

这使得完美的感觉!我想测试响应是一个对象,而不是方法本身。我在运行此测试时遇到了以前从未见过的错误... ZoneQueueRunner.jasmine.QueueRunner.ZoneQueueRunner.execute错误(http:// localhost:9878node_modules/zone.js/dist/jasmine-patch。 js:132:42)[] \t at [] – MadCatm2

+0

请确保您的test.ts中包含以下行:require('zone.js/dist/zone'); require('zone.js/dist/long-stack-trace-zone'); require('zone.js/dist/async-test'); require('zone.js/dist/fake-async-test'); require('zone.js/dist/sync-test'); require('zone.js/dist/proxy-zone'); //自zone.js 0.6.14 require('zone.js/dist/jasmine-patch'); //从zone.js开始0.6.14 –

+0

我需要澄清,因为我不确定test.ts究竟是什么。那是我的spec文件,我正在写测试本身,比如eventservice.spec.ts?是业务配置或垫片文件...或茉莉花核心中的某个地方?我的zone.js是0.8.4 – MadCatm2

相关问题