2016-12-06 74 views
1

我正在使用jest測試一個模塊,該模塊調用一個函數,該函數又調用GoogleAnalyticsTracker從react-native-google-analytics-bridge。我試過所有我能想到的東西(文檔有點稀疏)來模擬這個函數,但我總是得到真正的模塊而不是模擬模塊。你能看到哪一步我錯了或失蹤?如何在使用jest進行測試時模擬react-native-google-analytics-bridge?

jest.mock('react-native-google-analytics-bridge'); 
import {GoogleAnalyticsTracker} from 'react-native-google-analytics-bridge'; 

describe('testing mocking',() => { 
    it ('should return undefined when mocked',() => { 
    let tracker2 = new GoogleAnalyticsTracker(null); 
    expect(tracker2).toBe(undefined); 
    }) 
}) 

...但它總是設法找到unmocked模塊...

Expected value to be (using ===): 
     undefined 
    Received: 
     {"allowIDFA": [Function allowIDFA], "setAnonymizeIp": [Function setAnonymizeIp], "setAppName": [Function setAppName], "setAppVersion": [Function setAppVersion], "setSamplingRate": [Function setSamplingRate], "setTrackUncaughtExceptions": [Function setTrackUncaughtExceptions], "setUser": [Function setUser], "trackEvent": [Function trackEvent], "trackEventWithCustomDimensionValues": [Function trackEventWithCustomDimensionValues], "trackException": [Function trackException], "trackMultiProductsPurchaseEvent": [Function trackMultiProductsPurchaseEvent], "trackMultiProductsPurchaseEventWithCustomDimensionValues": [Function trackMultiProductsPurchaseEventWithCustomDimensionValues], "trackPurchaseEvent": [Function trackPurchaseEvent], "trackScreenView": [Function trackScreenView], "trackScreenViewWithCustomDimensionValues": [Function trackScreenViewWithCustomDimensionValues], "trackSocialInteraction": [Function trackSocialInteraction], "trackTiming": [Function trackTiming], "transformCustomDimensionsFieldsToIndexes": [Function transformCustomDimensionsFieldsToIndexes]} 

回答

2

這是答案......你真的需要從模塊中獲得真正的物體,然後再嘗試嘲笑它!

import {GoogleAnalyticsTracker} from 'react-native-google-analytics-bridge'; 
jest.mock('react-native-google-analytics-bridge'); 

我現在可以創建一個跟蹤器...

let tracker1 = new GoogleAnalyticsTracker('ABC-123'); 

......並把它傳遞到我試圖測試功能。

玩笑創建tracker1.trackTiming,我可以找出哪些參數是通過傳遞給它......

console.log('tracker1',tracker1.trackTiming.mock.calls); 

這在我的情況下返回將被寫入到Google分析,而不實際污染我的分析數據與參數測試數據。

+1

我很高興你找到答案:) – Kutyel

+0

你能分享整個代碼嗎?我仍然無法工作...... – alexmngn

1

您是否嘗試過用嘲笑的版本作爲進口嗎?

var GoogleAnalyticsTracker = jest.mock('react-native-google-analytics-bridge'); 
+0

我使用'VAR GoogleAnalyticsTracker = jest.fn()取得了一些進展;'在這種情況下GoogleAnalyticsTracker是嘲笑函數,它就像指望它被調用的次數等,所有這些有用的東西,但我仍然不能從模塊中嘲笑。當我嘗試分配'let tracker2 = new GoogleAnalyticsTracker('ABC-123')時出錯;'GoogleAnalyticsTracker不是函數。我真正需要的是模塊中的所有對象都被模擬,以便我可以測試它們是否被正確調用。 – ukayer

+0

我正在測試一個模塊,然後調用一個日誌記錄模塊。我按照上面的方法創建了模擬跟蹤器,然後將它傳遞到被測函數中,以便日誌函數可以使用它。當然,當日志函數試圖調用tracker.trackTiming('testcategory',13000,{name:'LoadList'});'因爲我沒有嘲笑模塊而反應失敗'react-native-google-analytics-bridge '正確。 – ukayer

1

您可以使用Jest的genMockFromModule方法並將其添加到模擬中。

const mockAnalytics = jest.genMockFromModule('react-native-google-analytics-bridge'); 
module.exports = mockAnalytics; 
相關問題