我正在try 用Jest为我的一个使用Amazon Cognito的Create Reaction App项目编写一些单元测试.

测试中的代码:

const getNewCognitoUser = (username) => {
    const userData = {
        Username: username,
        Pool: userPool,
    };
    return new CognitoUser(userData);
};

const setAWSCredentials = (jwt) => {
    return new Promise((resolve, reject) => {
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: appConfig.IdentityPoolId,
            Logins: {
                [appConfig.Logins.cognito.identityProviderName]: jwt,
            },
        });
        AWS.config.credentials.clearCachedId();
        AWS.config.credentials.refresh((err) => {
            err ? reject(err) : resolve();
        });
    });
};

export const authenticate = (username, password) => {
    const authenticationDetails = new AuthenticationDetails({
        Username: username,
        Password: password,
    });

    cognitoUser = getNewCognitoUser(username);

    return new Promise((resolve, reject) => {
        cognitoUser.authenticateUser(authenticationDetails, {
            onSuccess: function (result) {
                setAWSCredentials(result.idToken.jwtToken)
                    .then(() => {
                        resolve(result);
                    })
                    .catch((err) => {
                        reject(err);
                    });
            },
            onFailure: function (err) {
                reject(err);
            },
            newPasswordRequired: function (userAttributes, requiredAttributes) {
                reject({
                    code: "PasswordResetRequiredException",
                    message: "New Password Required",
                    newPasswordRequired: true,
                });
            },
        });
    });
};

这个测试

import { authenticate } from "../user";
import { CognitoUser } from "amazon-cognito-identity-js";
import AWS from "aws-sdk";

jest.mock("amazon-cognito-identity-js", () => {
    const mCognitoUser = {
        authenticateUser: jest.fn((authenticationDetails, callbacks) => {
            if (callbacks && callbacks.onSuccess) {
                // Simulate a successful authentication

                callbacks.onSuccess({ idToken: { jwtToken: "fakeToken" } });
            }
        }),
    };

    return {
        CognitoUser: jest.fn(() => mCognitoUser),

        CognitoUserPool: jest.fn(),

        AuthenticationDetails: jest.fn(),

        CognitoUserAttribute: jest.fn(),
    };
});

jest.mock("aws-sdk", () => {
    const mCognitoIdentityCredentials = jest.fn().mockImplementation(() => {
        return {
            clearCachedId: jest.fn(),

            refresh: jest.fn(),
        };
    });

    return {
        CognitoIdentityCredentials: mCognitoIdentityCredentials,
        config: {},
    };
});

describe("do I understand mocks", () => {
    test("let's find out", async () => {
        console.log(CognitoUser);
        const mCognitoUser = new CognitoUser();
        console.log(mCognitoUser);
        console.log(mCognitoUser.authenticateUser);

        await authenticate("foo", "bar");
        expect(CognitoUser.authenticate).toBeCalledTimes(1);
    });
});

这告诉我,函数authateUser是未定义的,当然,它在try 运行时会失败

await authenticate("foo", "bar")

声明说

TypeError: cognitoUser.authenticateUser is not a function

AFAICT,代码被适当地模拟了,那么为什么它看不到验证用户有一个模拟实现呢?

推荐答案

我找到了解决方案.

该应用程序是使用Create Reaction App生成的,ResetMock的默认设置为True,其效果是完全消除了我设置的模拟实现.我不确定为什么这是默认设置,但是将以下代码添加到我的Package.json文件中就解决了这个问题.

    "jest": {
        "resetMocks": false
    }

Reactjs相关问答推荐

无法覆盖MUI工具栏上的左右填充,除非使用!重要

从另一个组件更改组件中const的状态

安装后未渲染tailwind

无法找出状态正在被更改的位置

自定义变量默认、聚焦和填充时所需TextField中标签的星号 colored颜色

React 错误: 只能用作 元素的子元素,从不直接渲染.请将您的 包裹在

如何使用服务器中的数据自动填充表单字段?

获取 不能显示为 的后代.错误,但不太确定如何构建我的代码以避免此警告

Reactjs:MUI5:MobileDateTimePicker API:如何自定义日历中的文本

如何在我的自定义主题中样式化MUI TreeItem组件

redux 工具包使用中间件构建器函数时,必须返回一个中间件数组

如何使用 React Hook Form 将寄存器作为 props 发送到子组件来收集数据?

意外的标记.您可能需要一个合适的加载器来处理这种文件类型.书?.img? /*#__PURE__*/React.createElement("img",

如何在对话素材ui中设置边框半径?

从一个获取 axios 请求(ReactJS)中删除默认参数

使用 yarn 编译 protobuf js 时出现错误pbjs: command not found

如何在 React JS 上使文本中的单词可点击

由于另一个子组件,如何在react 中渲染另一个子组件

警告:您在没有 `onChange` 处理程序的情况下为表单字段提供了 `value` 属性

可以'读取未定义的属性(读取'路径')