在模拟http promise服务时获取`then then is not function`错误

时间:2018-02-07 08:38:51

标签: angular unit-testing typescript jasmine observable

原始服务

getVersionDataValuesforPopup(Docversion, versionname, Structureweek, docVersionFieldID, versionid, WLTP) {
        return this.http.get(this.apiUrl + 'GetElementPopUpData?docVersion=' + Docversion + '&versionVariant=' + versionname
            + '&structureWeek=' + Structureweek + '&docVersionFieldID=' + docVersionFieldID
            + ' &VersionId=' + versionid + ' &isWLTP=' + WLTP, { withCredentials: true })
            .toPromise().then(responce => <CoCCreateVersionPopupPage[]>responce.json())
            .catch(error => {
                return error;
            });
    }

在组件中调用原始服务

this.createversionservice.getVersionDataValuesforPopup(this.cocviewversiondatapage.docVersion,
            this.cocviewversiondatapage.VersionDescriptions,
            this.cocviewversiondatapage.structWeek, dataitems.DocumentVersionFieldId, this.cocviewversiondatapage.Id,
            this.cocviewversiondatapage.WLTP)
            .then(
            data=> { ...});

通过constructor injection

模拟服务
getVersionDataValuesforPopup(Docversion, versionname, Structureweek, docVersionFieldID, versionid, WLTP) {
        return Observable.of({ Result: {} });
    }

我在测试方法时遇到错误

  

TypeError:this.createversionservice.getVersionDataValuesforPopup(...)。那么不是函数

我知道错误的原因,我在我的模拟服务中使用Observable但真正的服务有promise,所以然后回调不支持。请告诉我如何写一个模拟为http承诺服务电话提供服务。

2 个答案:

答案 0 :(得分:1)

您使用的是哪种测试框架?

我会创建一个间谍,例如使用Jasmine:

spyOn(createversionservice, 'getVersionDataValuesforPopup')

然后您可以检查您的函数是否被调用。

如果要返回一个promise,可以使用.andReturnValue()方法,例如:

var promise = Promise.resolve('result');
spyOn(createversionservice, 'getVersionDataValuesforPopup').andReturnValue(promise);

其他框架中也会存在类似的间谍

然后,您可以检查方法是否被调用(或者您想要的任何测试,例如:

expect(createversionservice.getVersionDataValuesforPopup).toHaveBeenCalled()

答案 1 :(得分:1)

请您尝试以下方法:

return new Promise((resolve) => { resolve({}); });