我正在尝试用Jest为我使用Amazon Cognito的Create React 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);
});
});
型
这告诉我,函数authenticateUser是未定义的,当然,当尝试运行时,它会失败
await authenticate("foo", "bar")
型
指出
TypeError: cognitoUser.authenticateUser is not a function
型
AFAICT,代码被正确地模拟了,那么为什么它看不到有一个用于authenticateUser的模拟实现呢?
1条答案
按热度按时间ybzsozfc1#
我找到解决办法了。
这个应用程序是使用Create React App生成的,resetMocks的默认设置是true,这会让我设置的mock实现消失。我不知道为什么这是默认设置,但是在我的package.json文件中添加以下内容解决了这个问题。
字符串