我是Jasmine的新手,我正在尝试编写一个简单的单元测试,检查我的方法是否返回了预期的值。这是我的Angular应用程序中的方法:
<% @publications.each do |publication| %>
<p><%= publication.month_published %></p>
<% end %>
正如您所看到的,这是一种保存“技术事件”的帖子方法。宾语。以下是我试图在我的规范中编写的测试:
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)
}
此测试失败:(。我的目标是简单地测试该方法返回一个对象并返回传递的特定对象。我想知道我是否还可以测试它是否是JSON ...
答案 0 :(得分: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();
});
});
因为这是异步的,所以jasmine可能会认为测试是在实际加载回调之前完成的(甚至从未到达expect
调用,并且在没有运行它的情况下声明测试是通过的。)因此,你可以将done
传入您的测试,然后在您拨打done()
回拨之前,jasmine不会认为您的测试已完成。
旁注:养成在适当的时候用分号结束行的习惯。