我有这个函数,它调用 util 函数来进行 api 调用。 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 block then(function1, function2)
中的resolve、reject回调。必须测试 function1 内的代码块是否调用了一些预期的函数。
最佳答案
您描述的方法(模拟 utilMethod
来解析/拒绝)是一个很好的方法。
这是一个简单的工作示例,可以帮助您入门:
注意:我将 functionOne
实现为类方法,将 functionTwo
实现为实例属性 展示如何监视这两种类型的函数:
util.js
export const utilMethod = async () => 'original';
代码.js
import { utilMethod } from './util';
export class MyClass {
functionOne() { } // <= class method
functionTwo = () => { } // <= instance property
theClassMethod() {
return utilMethod().then(
result => { this.functionOne() },
error => { this.functionTwo() }
);
}
}
代码.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!
});
关于javascript - 开 Jest 测试一下解析拒绝回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55857947/