Платформенное тестирование реагирования на нативную шутку - PullRequest
3 голосов
/ 06 марта 2019

Проект RN, над которым я работаю, задуман как «только для Android», поэтому не было необходимости добавлять библиотеки типа «response-native-firebase» с cocoapods. Я должен упомянуть заранее, что у меня нет доступа к любому Mac или MacBook для этого. Вот фрагменты из package.json

...
"scripts": {
  "test": "jest"
},
"jest": {
  "preset": "react-native"
},
...

и babel.config.js

module.exports = {
    presets: [
      [
        'module:metro-react-native-babel-preset',
        {
          targets: {
            node: 'current',
          },
          loose: true,
          modules: 'auto',
        },
      ],
    ],
  };

Макетная функция для тестирования шутки:

// testing jest
const generateText = (name, age) => {
  return `${name} (${age} years old)`;
};

И юнит-тест для него:

import { generateText } from '../actions/authActions';

test('Some test', () => {
  const text = generateText('Zuul', 300);
  expect(text).toBe('Zuul (300 years old)');
});

При всех этих настройках yarn test выдает:

    RNFirebase core module was not found natively on iOS,
ensure you have correctly included the RNFirebase pod in
your projects `Podfile` and have run `pod install`.

Вопрос в том, есть ли способ заставить шутку пропустить проверки, связанные с ios, и сосредоточиться только на вещах для Android?

Обновление: По-видимому, есть способ переопределить предварительные настройки jest, поэтому я добавил это в package.json:

"jest": {
  "preset": "react-native",
  "haste": {
    "defaultPlatform": "android",
    "platforms": [
      "android",
      "ios",
      "native"
    ],
    "providesModuleNodeModules": [
      "react-native"
    ]
  }
},

Теперь у меня есть это сообщение об ошибке:

RNFirebase core module was not found natively on Android,
ensure you have correctly added the RNFirebase and Firebase
gradle dependencies to your `android/app/build.gradle` file.

Что не так, потому что все необходимые зависимости были добавлены в build.gradle:

dependencies {
    ...
    implementation project(':react-native-firebase')
    // Firebase dependencies
    implementation "com.google.android.gms:play-services-base:16.0.1"
    implementation "com.google.firebase:firebase-core:16.0.6"
    implementation('com.crashlytics.sdk.android:crashlytics:2.9.5@aar') {
        transitive = true
    }
    implementation "com.google.firebase:firebase-messaging:17.3.4"
    implementation 'me.leolin:ShortcutBadger:1.1.21@aar'
    ...
}

1 Ответ

1 голос
/ 06 марта 2019

Видимо, это хорошо известная проблема.Я нашел решение здесь .В основном я перенес настройки jest из package.json в jest.config.js:

//jest.config.js
module.exports = {
  preset: 'react-native',
  haste: {
    defaultPlatform: 'android',
    platforms: [
      'android',
      'ios',
      'native',
    ],
    providesModuleNodeModules: [
      'react-native',
    ],
  },
  setupFilesAfterEnv: ['./src/__mocks__/mockNativeLibs.js'],
  automock: false,
  moduleNameMapper: {
    '\\.(css|less)$': 'identity-obj-proxy',
    '^.+\\.(jpg|jpeg|gif|png|mp4|mkv|avi|webm|swf|wav|mid)$': 'jest-static-stubs/$1',
  },
  globals: {
    __DEV__: true,
  },
  collectCoverageFrom: [
    '**/src/**/*.{js,jsx}',
    '!**/src/**/style.js',
    '!**/src/**/index.js',
    '!**/src/theme/**',
    '!**/android/**',
    '!**/ios/**',
    '!**/node_modules/**',
    '!**/scripts/**',
    '!**/__test__/**',
  ],
  verbose: true,
  testPathIgnorePatterns: ['/node_modules/'],
};

и добавил этот файл:

//mockNativeLibs.js
jest.mock('react-native-firebase', () => {
  return {
    messaging: jest.fn(() => {
      return {
        hasPermission: jest.fn(() => Promise.resolve(true)),
        subscribeToTopic: jest.fn(),
        unsubscribeFromTopic: jest.fn(),
        requestPermission: jest.fn(() => Promise.resolve(true)),
        getToken: jest.fn(() => Promise.resolve('myMockToken')),
      };
    }),
    notifications: jest.fn(() => {
      return {
        onNotification: jest.fn(),
        onNotificationDisplayed: jest.fn(),
      };
    }),
    crashlytics: jest.fn(() => {
      return {
        recordError: jest.fn(),
      };
    }),
  };
});

// apparently there were more libraries causing problems with jest
jest.mock('pushy-react-native', () => {
  return {};
});

jest.mock('react-native-localize', () => {
  return {};
});

jest.mock('react-native-sound', () => {
  return {};
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...