2016-12-06 4 views
1

Я тестирую модуль с помощью шутки, и этот модуль вызывает функцию, которая, в свою очередь, вызывает GoogleAnalyticsTracker из-за моста реакции-native-google-analytics. Я пробовал все, что я могу придумать (документация немного разрежена), чтобы издеваться над этой функцией, но я всегда получаю настоящий модуль не издеваемым модулем. Вы видите, какой шаг я ошибаюсь или пропал?Как мне придумать мотив реагирования-native-google-analytics-bridge при использовании jest для тестирования?

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'); 

... и передать его в функцию Я пытаюсь проверить.

Jest создает tracker1.trackTiming и я могу выяснить, какие параметры были переданы ему, используя ...

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

Что в моем случае возвращает параметры, которые будут записаны в GoogleAnalytics фактически не загрязняют мои аналитические данные с тестовые данные.

+1

Я рад, что вы нашли ответ :) – Kutyel

+0

Не могли бы вы поделиться всем кодом? Я все еще не могу заставить его работать ... – alexmngn

1

Вы пробовали, используя высмеивал версию как импортного?

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

Я сделал некоторый прогресс с помощью 'уага GoogleAnalyticsTracker = jest.fn();' и в этом случае GoogleAnalyticsTracker является издевалась функцией, которая делает все эти полезные вещи, как подсчитать, сколько раз он называется и т.д., но я все еще не могут издеваться над модулем. Ошибка, когда я пытаюсь назначить 'let tracker2 = новый GoogleAnalyticsTracker ('ABC-123');' является то, что GoogleAnalyticsTracker не является функцией. Мне действительно нужно, чтобы все объекты в модуле были издевались, чтобы я мог проверить, что все они правильно вызывается. – ukayer

+0

Я тестирую модуль, который в свою очередь вызывает модуль протоколирования. Я создаю смеющийся трекер, как указано выше, и передаю его в тестируемую функцию, чтобы он мог использоваться функцией регистрации. Конечно, когда функция журналирования пытается вызвать 'tracker.trackTiming ('testcategory', 13000, {name: 'LoadList'}),' он терпит неудачу, потому что я не издевался над модулем 'response-native-google-analytics-bridge 'правильно. – ukayer

1

Вы можете использовать метод genMockFromModule by Jest и добавить его к mocks.

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