猿问

开玩笑测试解决拒绝回调

我有这个函数,它为api调用调用util函数。util函数根据api结果解析或拒绝。


现在,我需要对具有以下结构的回调函数进行单元测试。


`theClassMethod : () => {

    return utilMethod().then(

    result => { this.functionOne() //Test this function is called }, 

    error => { this.functionTwo() //Test this function is called }

    )

}`

util方法返回一个promise,如下所示:


utilFunc = (data :string) :Promise<ResultData[]> => {

    return new Promise(async (resolve, reject) => {

        try{

            resolve(data)

        }catch{

            reject(error)

        }

    }) 

}

https://codesandbox.io/s/vjnwy1zw75?fontsize=14


我试过的


模拟util方法来解决/拒绝。调用类方法并执行断言。它不起作用,并且测试始终以假阳性通过。

我花了很多时间寻找类似的问题。这里的大多数问题是要测试代码,例如:


theClassMethod : () => { utilMethod.then().catch()}


我要解决的问题是测试解决方案,然后在then块中拒绝回调then(function1, function2)。必须测试function1内部的代码块是否调用了某些预期的函数。


SMILET
浏览 141回答 1
1回答

冉冉说

您所描述的方法(模拟utilMethod解决/拒绝)是一种很好的方法。这是一个简单的工作示例,可帮助您入门:注:我实现了functionOne作为一个类的方法,并functionTwo作为一个实例属性,以显示如何在这两种类型的间谍功能:util.jsexport const utilMethod = async () => 'original';code.jsimport { utilMethod } from './util';export class MyClass {&nbsp; functionOne() { }&nbsp; // <= class method&nbsp; functionTwo = () => { }&nbsp; // <= instance property&nbsp; theClassMethod() {&nbsp; &nbsp; return utilMethod().then(&nbsp; &nbsp; &nbsp; result => { this.functionOne() },&nbsp; &nbsp; &nbsp; error => { this.functionTwo() }&nbsp; &nbsp; );&nbsp; }}code.test.jsimport { MyClass } from './code';import * as util from './util';test('theClassMethod', async () => {&nbsp; const mock = jest.spyOn(util, 'utilMethod');&nbsp; const instance = new MyClass();&nbsp; const functionOneSpy = jest.spyOn(MyClass.prototype, 'functionOne');&nbsp; // <= class method&nbsp; const functionTwoSpy = jest.spyOn(instance, 'functionTwo');&nbsp; // <= instance property&nbsp; mock.mockResolvedValue('mocked value');&nbsp; // <= mock it to resolve&nbsp; await instance.theClassMethod();&nbsp; expect(functionOneSpy).toHaveBeenCalled();&nbsp; // Success!&nbsp; mock.mockRejectedValue(new Error('something bad happened'));&nbsp; // <= mock it to reject&nbsp; await instance.theClassMethod();&nbsp; expect(functionTwoSpy).toHaveBeenCalled();&nbsp; // Success!});
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答