簡體   English   中英

JEST錯誤TypeError:specificMockImpl.apply不是函數

[英]JEST error TypeError: specificMockImpl.apply is not a function

嘗試使用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');
        }
    });
});

而我試圖測試的功能如下:

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);
        });
    });
}

還有其他方法可以在開玩笑中模擬功能嗎? 我讀過一篇文章https://www.zhubert.com/blog/2017/04/12/testing-with-jest/

在這一行,你傳遞三個參數,而不是將函數傳遞給mockImplementation

jest.fn().mockImplementation(boxConfig.BOX_AUTH_CODE, null, cb => {
  cb('Error', null);
});

看起來你可能剛剛錯過了一些牙箍。 嘗試將其切換為:

jest.fn().mockImplementation((boxConfig.BOX_AUTH_CODE, null, cb) => {
  cb('Error', null);
});

最好不要試圖改變其他地方使用的const
您可以更改getTokensWithAuthCode以使其接收sdk作為參數,因此在您的測試中,您將傳遞模擬函數作為參數,因此具有比直接變異sdk更可預測的行為。

在您的代碼中,您可以使用簽名getTokensWithAuthCodeUnbound(sdk)進行第二次getTokensWithAuthCode實現,然后將其導出。 此實現將用於您的測試。
使用相同的getTokensWithAuthCode名稱導出,您可以調用:

export const getTokensWithAuthCode = getTokensWithAuthCodeUnbound.bind(null, sdk)

這樣一來,您的應用程序將使用getTokensWithAuthCodeUnbound綁定默認的sdk ,並且可以測試更容易實施。

Mozilla開發人員網絡(MDN) bind 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM