2017-10-15 146 views
0

我有一個「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. 

在我的測試,我想嘲笑權限和通知,所以我可以做這樣的事情在notifications.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.mockjest.setMock嘗試了各種東西,但我似乎無法得到這個工作。我如何着手以所需的方式嘲笑這些命名的導入?例如,我試過這個:

jest.setMock('Permissions',() => ({ 
    askAsync: jest 
    .fn() 
    .mockImplementationOnce(() => ({ status: 'granted' })) 
})) 

但這並不奏效。它拋出

'module Permissions cannot be found from notifications.spec.js' 

如果我試圖嘲弄整個世博模塊,嘲笑的功能expect().toBeCalled()返回false。

回答

0

你要嘲笑模塊'expo'

jest.mock('expo',()=>({ 
    Permissions: { 
    askAsync: jest.fn() 
    } 
})) 
+0

我最初想這一點,但我認爲這是行不通的,因爲我的測試失敗。但事實證明,他們失敗了,因爲我的執行有一個錯誤。所以這確實是正確的方法。 – BarthesSimpson