【问题标题】:getting `then is not a function` error while mocking http promise service模拟http承诺服务时出现“then is not a function”错误
【发布时间】:2018-07-17 11:24:19
【问题描述】:

原创服务

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(...).then 不是函数

我知道错误的原因,我在我的模拟服务中使用Observable,但真正的服务有promise,所以回调不支持。请让我知道如何为@编写模拟服务987654327@承诺服务电话。

【问题讨论】:

  • 我会建议这样的事情:return new Promise((resolve) =&gt; { resolve(null); });
  • 我需要为此导入什么??
  • 您无需导入任何内容。
  • @Nour 是的。这对我有用。您能否将其发布为答案。我会标记为正确答案
  • 很高兴为您提供帮助 :)

标签: angular unit-testing typescript jasmine observable


【解决方案1】:

我已经用下面的代码解决了:

Promise.resolve({then: jest.fn()})

【讨论】:

  • 这应该是正确的答案。如果您遇到 .catch 块的相同错误,它也可以解决。 Promise.resolve({then: jest.fn(), catch: jest.fn()})
【解决方案2】:

请您尝试以下方法:

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

【讨论】:

    【解决方案3】:

    您使用的是什么测试框架?

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

    spyOn(createversionservice, 'getVersionDataValuesforPopup')

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

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

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

    类似的间谍将存在于其他框架中

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

    expect(createversionservice.getVersionDataValuesforPopup).toHaveBeenCalled()
    

    【讨论】:

    • 我收到此错误是因为我的模拟服务中没有该函数名称
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2022-11-05
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多