J. *_*ers 14 javascript unit-testing reactjs jestjs react-native
我想用Jest模拟React Native中的node_module'React Native Keychain'.
在文档之后,我创建了一个名为的文件夹,__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
};
});
Run Code Online (Sandbox Code Playgroud)
然后,我为使用此库的函数编写了测试:
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);
});
});
});
Run Code Online (Sandbox Code Playgroud)
问题是,测试失败了.我收到错误消息:
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)
Run Code Online (Sandbox Code Playgroud)
而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] } }
Run Code Online (Sandbox Code Playgroud)
这告诉我:1.模拟工作(因为true正确返回)或者setGenericPassword
调用React Native Keychain 的实际函数.2.由于某种原因,keychainfunctions
已定义,但作为jest.mock
对象而不是三个模拟函数.
如果模拟有效,感觉就像1和2相互矛盾.我究竟做错了什么?为什么这个模拟不起作用?如何console.log()
解释这些奇怪的和失败的测试?
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
Run Code Online (Sandbox Code Playgroud)
您可以尝试在测试中使用genMockFromModule并仅模拟所需的方法。
希望能帮助到你
归档时间: |
|
查看次数: |
13589 次 |
最近记录: |