【问题标题】:Test observable return value of method with Jasmine用 Jasmine 测试方法的可观察返回值
【发布时间】:2017-08-08 18:42:12
【问题描述】:

我是 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)  
}

如您所见,它是一个保存“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))

    })

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

【问题讨论】:

    标签: javascript angular unit-testing jasmine


    【解决方案1】:

    您的方法是异步的,这通常是 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 不会认为您的测试已经完成。

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

    【讨论】:

    • 这很有意义!我想测试响应是一个对象,而不是方法本身。但是,在运行此测试时,我确实遇到了一个我以前从未见过的错误... ZoneQueueRunner.jasmine.QueueRunner.ZoneQueueRunner.execute (localhost:9878node_modules/zone.js/dist/jasmine-patch.js:132:42) [] at []跨度>
    • 确保您的 test.ts 中有以下行: require('zone.js/dist/zone');要求('zone.js/dist/long-stack-trace-zone');要求('zone.js/dist/async-test');要求('zone.js/dist/fake-async-test');要求('zone.js/dist/sync-test');要求('zone.js/dist/proxy-zone'); // 因为 zone.js 0.6.14 需要('zone.js/dist/jasmine-patch'); // 从 zone.js 0.6.14 开始放在这里
    • 我需要澄清一下,因为我不确定 test.ts 到底是什么。那是我正在编写测试本身的规范文件吗,例如 eventservice.spec.ts?业力配置或垫片文件...或茉莉花核心的某个地方?我的 zone.js 是 0.8.4
    • PS 这是我的 karma.conf.js // zone.js 'node_modules/zone.js/dist/zone.js', 'node_modules/zone.js/dist/long -stack-trace-zone.js'、'node_modules/zone.js/dist/proxy.js'、'node_modules/zone.js/dist/sync-test.js'、'node_modules/zone.js/dist/jasmine -patch.js','node_modules/zone.js/dist/async-test.js','node_modules/zone.js/dist/fake-async-test.js',
    • 在我的项目中,test.ts 在\src\test.ts 下。 karma.conf.js 需要它并递归加载所有 .spec 和框架文件
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2018-01-13
    • 2019-12-31
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多