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

Mad*_*tm2 3 javascript unit-testing jasmine angular

我是 Jasmine 的新手,我正在尝试编写一个简单的单元测试来检查我的方法是否返回预期值。这是我的 Angular 应用程序中的方法:

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)  
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它是一个保存“techEvent”对象的 post 方法。这是我试图在规范中编写的测试:

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

    })
Run Code Online (Sandbox Code Playgroud)

这个测试失败了:(。我的目标是简单地测试该方法是否返回一个对象并返回传递的特定对象。我想知道我是否也可以测试它是否是一个 JSON...

Jas*_*lin 5

您的方法是异步的,这通常是 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();
    });
});
Run Code Online (Sandbox Code Playgroud)

因为这是异步的,所以 jasmine 可能会认为测试在实际加载回调之前完成(甚至从未到达调用expect,并在未运行测试的情况下声明测试通过。)因此,您可以传入done测试,并且那么茉莉花不会认为你的测试已经完成,直到你调用回调done()

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