开玩笑测试解决拒绝回调

时间:2019-04-25 21:34:26

标签: javascript reactjs unit-testing promise jestjs

我有这个函数,它为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方法返回如下承诺:

utilFunc = (data :string) :Promise<ResultData[]> => {
    return new Promise(async (resolve, reject) => {
        try{
            resolve(data)
        }catch{
            reject(error)
        }
    }) 
}

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

我尝试过的事情:

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

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

  

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

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

1 个答案:

答案 0 :(得分:3)

您正在描述的方法(模拟utilMethod来解决/拒绝)是一种很好的方法。

这是一个简单的示例,可以帮助您入门:

注意:我将functionOne实现为类方法,将functionTwo实现为 instance属性,以展示如何监视两种类型的功能:

util.js

export const utilMethod = async () => 'original';

code.js

import { utilMethod } from './util';

export class MyClass {
  functionOne() { }  // <= class method
  functionTwo = () => { }  // <= instance property
  theClassMethod() {
    return utilMethod().then(
      result => { this.functionOne() },
      error => { this.functionTwo() }
    );
  }
}

code.test.js

import { MyClass } from './code';
import * as util from './util';

test('theClassMethod', async () => {
  const mock = jest.spyOn(util, 'utilMethod');

  const instance = new MyClass();

  const functionOneSpy = jest.spyOn(MyClass.prototype, 'functionOne');  // <= class method
  const functionTwoSpy = jest.spyOn(instance, 'functionTwo');  // <= instance property

  mock.mockResolvedValue('mocked value');  // <= mock it to resolve
  await instance.theClassMethod();
  expect(functionOneSpy).toHaveBeenCalled();  // Success!

  mock.mockRejectedValue(new Error('something bad happened'));  // <= mock it to reject
  await instance.theClassMethod();
  expect(functionTwoSpy).toHaveBeenCalled();  // Success!
});