我有一个看起来有点像这样的“notifications.js”模块:
import { Notifications, Permissions } from 'expo'
export function setLocalNotification(storage = AsyncStorage) {
return storage
.getItem(NOTIFICATION_KEY)
.then(JSON.parse)
.then(data => {
if (data === null) {
return Permissions.askAsync(
Permissions.NOTIFICATIONS
).then(({ status }) => {
if (status === 'granted') {
Notifications.cancelAllScheduledNotificationsAsync()
...etc.
在我的测试中,我想模拟 Permissions 和 Notifications,这样我就可以在 notification.spec.js 中做这样的事情:import { setLocalNotification } from './notifications'
import mockAsyncStorage from '../mock/AsyncStorage'
it('correctly cancels pending notifications', done => {
setLocalNotification(mockAsyncStorage).then(done())
expect(Permissions.askAsync).toBeCalled()
expect(Notifications.cancelAllScheduledNotificationsAsync)
.toBeCalled()
})
我用 jest.mock
尝试了各种方法和 jest.setMock
但我似乎无法让这个工作。如何以所需的方式模拟这些命名导入?例如,我试过这个:jest.setMock('Permissions', () => ({
askAsync: jest
.fn()
.mockImplementationOnce(() => ({ status: 'granted' }))
}))
但这不起作用。它抛出'module Permissions cannot be found from notifications.spec.js'
如果我尝试模拟整个 expo 模块,模拟函数 expect().toBeCalled()
返回假。
最佳答案
你必须模拟模块 'expo'
jest.mock('expo', ()=>({
Permissions: {
askAsync: jest.fn()
}
}))
关于react-native - 使用 Jest 模拟命名导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46761107/