Node_moduleの「React Native Keychain」をReact Native with Jest。
docs に従って、___mocks__
_というフォルダーを作成し、その中に_react-native-keychain.js
_というファイルを作成しました。
ファイル内のコードは次のとおりです。
_export default jest.mock("react-native-keychain", () => {
const token = "abcdefghijklmnopqrstuvwxyz0123456789";
const credentials = {
username: "session",
password: token
};
return {
setGenericPassword: jest.fn(
(username, password) => new Promise((resolve, reject) => resolve(true)) // eslint-disable-line no-unused-vars
),
getGenericPassword: jest.fn(() => new Promise((resolve, reject) => resolve(credentials))), // eslint-disable-line no-unused-vars
resetGenericPassword: jest.fn(() => new Promise((resolve, reject) => resolve(true))) // eslint-disable-line no-unused-vars
};
});
_
次に、このライブラリを使用する関数のテストを作成しました。
_import * as keyChainFunctions from "react-native-keychain";
import { setToken, getToken, clearToken } from "./secureStorage";
const token = "abcdefghijklmnopqrstuvwxyz0123456789";
describe("set token", () => {
it("saves the token in the keychain", () => {
expect.assertions(1);
return setToken(token).then(res => {
console.log(res);
console.log(keyChainFunctions);
expect(keyChainFunctions.setGenericPassword).toHaveBeenCalledWith("session", token);
});
});
});
_
問題は、テストが失敗することです。エラーメッセージが表示されます。
_ FAIL app/api/secureStorage/secureStorage.test.js
set token
✕ saves the token in the keychain (42ms)
● set token › saves the token in the keychain
expect(jest.fn())[.not].toHaveBeenCalledWith()
jest.fn() value must be a mock function or spy.
Received: undefined
10 | console.log(res);
11 | console.log(keyChainFunctions);
> 12 | expect(keyChainFunctions.setGenericPassword).toHaveBeenCalledWith("session", token);
| ^
13 | });
14 | });
15 | });
at app/api/secureStorage/secureStorage.test.js:12:52
at tryCallOne (node_modules/promise/lib/core.js:37:12)
at node_modules/promise/lib/core.js:123:15
at flush (node_modules/asap/raw.js:50:29)
● set token › saves the token in the keychain
expect.assertions(1)
Expected one assertion to be called but received zero assertion calls.
6 | describe("set token", () => {
7 | it("saves the token in the keychain", () => {
> 8 | expect.assertions(1);
| ^
9 | return setToken(token).then(res => {
10 | console.log(res);
11 | console.log(keyChainFunctions);
at Object.<anonymous> (app/api/secureStorage/secureStorage.test.js:8:12)
_
そして、console.log()
の結果:
_console.log app/api/secureStorage/secureStorage.test.js:10
true
console.log app/api/secureStorage/secureStorage.test.js:11
{ default:
{ addMatchers: [Function: addMatchers],
advanceTimersByTime: [Function: advanceTimersByTime],
autoMockOff: [Function: disableAutomock],
autoMockOn: [Function: enableAutomock],
clearAllMocks: [Function: clearAllMocks],
clearAllTimers: [Function: clearAllTimers],
deepUnmock: [Function: deepUnmock],
disableAutomock: [Function: disableAutomock],
doMock: [Function: mock],
dontMock: [Function: unmock],
enableAutomock: [Function: enableAutomock],
fn: [Function: bound fn],
genMockFromModule: [Function: genMockFromModule],
isMockFunction: [Function: isMockFunction],
mock: [Function: mock],
requireActual: [Function: bound requireModule],
requireMock: [Function: bound requireMock],
resetAllMocks: [Function: resetAllMocks],
resetModuleRegistry: [Function: resetModules],
resetModules: [Function: resetModules],
restoreAllMocks: [Function: restoreAllMocks],
retryTimes: [Function: retryTimes],
runAllImmediates: [Function: runAllImmediates],
runAllTicks: [Function: runAllTicks],
runAllTimers: [Function: runAllTimers],
runOnlyPendingTimers: [Function: runOnlyPendingTimers],
runTimersToTime: [Function: runTimersToTime],
setMock: [Function: setMock],
setTimeout: [Function: setTimeout],
spyOn: [Function: bound spyOn],
unmock: [Function: unmock],
useFakeTimers: [Function: useFakeTimers],
useRealTimers: [Function: useRealTimers] } }
_
これが私に伝えること:1.モックが動作する(trueが正しく返されるため)か、またはReact Native Keychainからの実際のsetGenericPassword
関数が呼び出されています。 、keychainfunctions
が定義されていますが、3つのモック関数ではなく_jest.mock
_オブジェクトとして定義されています。
モックが機能する場合、1と2は互いに矛盾しているように感じます。私は何を間違えていますか?このモックが機能しないのはなぜですか?これらの奇妙なconsole.log()
sと失敗したテストはどのように説明できますか?
Bamse オブジェクトをエクスポートするだけのコメントで提案されています。この回避策は機能します。私はまだそれを正しく行う方法/私が間違っていたことに興味があります。
_const token = "abcdefghijklmnopqrstuvwxyz0123456789";
const credentials = {
username: "session",
password: token
};
export const setGenericPassword = jest.fn(
(username, password) => new Promise((resolve, reject) => resolve(true)) // eslint-disable-line no-unused-vars
);
export const getGenericPassword = jest.fn(
() => new Promise((resolve, reject) => resolve(credentials)) // eslint-disable-line no-unused-vars
);
export const resetGenericPassword = jest.fn(() => new Promise((resolve, reject) => resolve(true))); // eslint-disable-line no-unused-vars
_
テストで genMockFromModule を使用し、必要なメソッドのみをモックすることができます。
それが役に立てば幸い