使用Jasmine测试方法的可观察返回值

时间:2017-08-08 18:42:12

标签: javascript angular unit-testing jasmine

我是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 ...

1 个答案:

答案 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不会认为您的测试已完成。

旁注:养成在适当的时候用分号结束行的习惯。