bad*_*l16 5 javascript typescript jest
尝试使用api回调模拟其中一个功能,并得到如下错误 TypeError: specificMockImpl.apply is not a function
import { IEnvironmentMap, load } from 'dotenv-extended';
import { getTokensWithAuthCode, sdk } from '../src/connection-manager';
describe('getTokensWithAuthCode function Tests', () => {
jest.useFakeTimers();
let boxConfig: IEnvironmentMap;
beforeAll(() => {
boxConfig = load({
errorOnMissing: true,
});
});
it('should reject a promise if there is wrong auth code provided', async () => {
sdk.getTokensAuthorizationCodeGrant = jest.fn().mockImplementation(boxConfig.BOX_AUTH_CODE, null, cb => {
cb('Error', null);
});
try {
const tokens = await getTokensWithAuthCode();
} catch (error) {
expect(error).toBe('Error');
}
});
});
Run Code Online (Sandbox Code Playgroud)
我正在尝试测试的功能如下:
import * as BoxSDK from 'box-node-sdk';
import { IEnvironmentMap, load } from 'dotenv-extended';
import {ITokenInfo} from '../typings/box-node-sdk';
const boxConfig: IEnvironmentMap = load({
errorOnMissing: true,
});
export const sdk: BoxSDK = new BoxSDK({
clientID: boxConfig.BOX_CLIENT_ID,
clientSecret: boxConfig.BOX_CLIENT_SECRET,
});
/**
* - Use the provided AUTH_CODE to get the tokens (access + refresh)
* - Handle saving to local file if no external storage is provided.
*/
export async function getTokensWithAuthCode() {
return new Promise((resolve: (tokenInfo: ITokenInfo) => void, reject: (err: Error) => void) => {
if (boxConfig.BOX_AUTH_CODE === '') {
reject(new Error('No Auth Code provided. Please provide auth code as env variable.'));
}
sdk.getTokensAuthorizationCodeGrant(boxConfig.BOX_AUTH_CODE, null, (err: Error, tokenInfo: ITokenInfo) => {
if (err !== null) {
reject(err);
}
resolve(tokenInfo);
});
});
}
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以嘲笑功能吗?我已经阅读了一篇文章https://www.zhubert.com/blog/2017/04/12/testing-with-jest/
在这行代码中mockImplementation,您没有传递函数给,而是传递了三个参数:
jest.fn().mockImplementation(boxConfig.BOX_AUTH_CODE, null, cb => {
cb('Error', null);
});
Run Code Online (Sandbox Code Playgroud)
看来您可能刚刚错过了一些牙套。尝试将其切换为:
jest.fn().mockImplementation((boxConfig.BOX_AUTH_CODE, null, cb) => {
cb('Error', null);
});
Run Code Online (Sandbox Code Playgroud)
最好不要试图改变const其他地方使用的。
您可以进行更改getTokensWithAuthCode以使其sdk作为参数接收,因此在测试中您将传递模拟函数作为参数,因此具有比直接变异更可预测的行为sdk。
在您的代码中,您可以进行第二次实现(例如getTokensWithAuthCode使用签名)并将其导出。getTokensWithAuthCodeUnbound(sdk)此实现将在您的测试中使用。
使用相同的getTokensWithAuthCode名称导出,您可以调用:
export const getTokensWithAuthCode = getTokensWithAuthCodeUnbound.bind(null, sdk)
Run Code Online (Sandbox Code Playgroud)
这样,您的应用程序将使用getTokensWithAuthCodeUnbound带有默认值的绑定sdk,并且您可以更轻松地测试其实现。
Mozilla 开发者网络 (MDN)bind 文档。
| 归档时间: |
|
| 查看次数: |
4769 次 |
| 最近记录: |