Amazon Developer

as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
Ring
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

手順6: 更新をテストする

手順6: 更新をテストする

6.1 jest.config.jsを更新する

transformIgnorePatterns@amazon-devices/react-native-keplerを含める必要があります。パッケージ4.0.0では、jest/setup.jsファイルでESモジュール構文が使用されています。このパターンがない場合、Jestは「SyntaxError: Cannot use import statement outside a module」というエラーで失敗します。

module.exports = {
  preset: 'react-native',
  setupFilesAfterEnv: ['<ルートディレクトリ>/jest.setup.js'],
  transformIgnorePatterns: [
    'node_modules/(?!((jest-)?react-native|@react-native(-community)?|@amazon-devices/react-native-kepler)|react-native-safe-area-context)',
  ],
};

6.2 jest.setup.jsを作成してTV向けのモックを定義する

RN 0.83では、テスト環境でのモックの動作が変更されています。次の例のように、TVに適したモックを定義するセットアップファイルを作成します。

// jest.setup.js

/**
 * TVプラットフォーム向けにDimensions APIのモックを定義します。
 * Fire TVデバイスでは1920x1080(フルHD)の解像度とスケール係数1を使用します。
 */
jest.mock('react-native/Libraries/Utilities/Dimensions', () => ({
  get: jest.fn().mockReturnValue({
    width: 1920,
    height: 1080,
    scale: 1,
    fontScale: 1,
  }),
  addEventListener: jest.fn(),
  removeEventListener: jest.fn(),
}));

/**
 * TVプラットフォーム向けにPixelRatio APIのモックを定義します。
 * TVデバイスではスケール係数1を使用します(ピクセルの拡大なし)。
 */
jest.mock('react-native/Libraries/Utilities/PixelRatio', () => ({
  default: {
    get: jest.fn().mockReturnValue(1),
    getFontScale: jest.fn().mockReturnValue(1),
    getPixelSizeForLayoutSize: jest.fn((layoutSize) => layoutSize),
    roundToNearestPixel: jest.fn((layoutSize) => layoutSize),
  },
}));

/**
 * NativeAnimatedModuleのモックを定義します。RN 0.83では特定の23個のメソッドが呼び出されます。
 * ナビゲーションアニメーションをトリガーするすべてのテストに必要です。
 */
jest.mock('react-native/Libraries/Animated/NativeAnimatedModule', () => ({
  __esModule: true,
  default: {
    startOperationBatch: jest.fn(),
    finishOperationBatch: jest.fn(),
    createAnimatedNode: jest.fn(),
    updateAnimatedNodeConfig: jest.fn(),
    getValue: jest.fn(),
    startListeningToAnimatedNodeValue: jest.fn(),
    stopListeningToAnimatedNodeValue: jest.fn(),
    connectAnimatedNodes: jest.fn(),
    disconnectAnimatedNodes: jest.fn(),
    startAnimatingNode: jest.fn(),
    stopAnimation: jest.fn(),
    setAnimatedNodeValue: jest.fn(),
    setAnimatedNodeOffset: jest.fn(),
    flattenAnimatedNodeOffset: jest.fn(),
    extractAnimatedNodeOffset: jest.fn(),
    connectAnimatedNodeToView: jest.fn(),
    disconnectAnimatedNodeFromView: jest.fn(),
    restoreDefaultValues: jest.fn(),
    dropAnimatedNode: jest.fn(),
    addAnimatedEventToView: jest.fn(),
    removeAnimatedEventFromView: jest.fn(),
    addListener: jest.fn(),
    removeListeners: jest.fn(),
  },
}));

6.3 Jestモックの.defaultのエクスポートを修正する

RN 0.83では、多くの内部モジュールがexport defaultを使用するように変更されています。既存のJestモックが.defaultプロパティのないプレーンなオブジェクトを返している場合、実行時にコンポーネントがundefinedを受け取ることになり、そこで問題が発生します。

症状:複数のテストスイートで「Cannot read properties of undefined (reading 'create')」が発生します。

影響を受けるモジュール

  • react-native/Libraries/StyleSheet/StyleSheet
  • react-native/Libraries/StyleSheet/flattenStyle
  • react-native/Libraries/EventEmitter/NativeEventEmitter
  • react-native/Libraries/Utilities/Platform
  • react-native/Libraries/Utilities/Dimensions
  • react-native/Libraries/Utilities/PixelRatio
  • react-native/Libraries/Utilities/useWindowDimensions
  • react-native/Libraries/BatchedBridge/NativeModules

オブジェクト型のエクスポートパターンの修正

// ❌ 更新前(RN 0.83で問題が発生)
jest.mock('react-native/Libraries/StyleSheet/StyleSheet', () => ({
  create: (styles) => styles,
  flatten: jest.fn(),
}));

// ✅ 変更後 - __esModuleとdefaultを含める
jest.mock('react-native/Libraries/StyleSheet/StyleSheet', () => {
  const impl = {
    create: (styles) => styles,
    flatten: jest.fn(),
  };
  return { __esModule: true, default: impl, ...impl };
});

関数型のエクスポートパターンの修正

// 関数型のデフォルトエクスポートでは、関数を直接defaultとして返します。
jest.mock('react-native/Libraries/StyleSheet/flattenStyle', () => {
  const impl = jest.fn((style) => style);
  return { __esModule: true, default: impl };
});

6.4 テストファイルを更新してact()でラップする

React 19では、次の例に示すように、テスト内の状態更新をact()でラップする必要があります。

// ❌ 更新前(RN 0.72)
import 'react-native';
import React from 'react';
import App from '../App';
import renderer from 'react-test-renderer';

it('正しくレンダリングされる', () => {
  renderer.create(<App />);
});

// ✅ 更新後(RN 0.83)- react-test-rendererを直接使用
import React from 'react';
import ReactTestRenderer from 'react-test-renderer';
import App from '../App';

test('正しくレンダリングされる', async () => {
  await ReactTestRenderer.act(() => {
    ReactTestRenderer.create(<App />);
  });
});

@testing-library/react-native

@testing-library/react-nativeを使用する場合ば、テストライブラリによってact()が内部で処理されます。このため、render()ReactTestRenderer.act()でラップしないでください。ラップすると、「Can't access .root on unmounted test renderer」というエラーが発生します。

// ✅ @testing-library/react-nativeを使用する場合の正しい例
import { render, fireEvent } from '@testing-library/react-native';

test('正しくレンダリングされる', () => {
  const screen = render(<App />);
  expect(screen).toMatchSnapshot();
});

test('ボタン押下を処理する', () => {
  const screen = render(<App />);
  fireEvent.press(screen.getByTestId('myButton'));
  expect(screen).toMatchSnapshot();
});

6.5 ナビゲーションスタックのタイマーのリークを修正する

react-navigation__stackを使用している場合、そのCard.tsxファイルで使用されるアニメーションのsetTimeoutコールバックが、Jestでテスト環境が破棄された後に呼び出されます。

症状:You are trying to import a file after the Jest environment has been torn down

修正:影響を受けるテストファイルに以下を追加します。

beforeEach(() => jest.useFakeTimers());
afterEach(() => {
  jest.runOnlyPendingTimers();
  jest.useRealTimers();
});

6.6 isolatedModulesの型のエクスポートエラーを修正する

TypeScriptから「TS1205: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'」というエラーが報告される場合は、次の例のように型のエクスポートを更新します。

// ❌ 更新前
export { Cookie } from './types/CookieManagerTypes';

// ✅ 更新後
export type { Cookie } from './types/CookieManagerTypes';

6.7 スナップショットを更新する

テストの修正がすべて完了したら、スナップショットを再生成します。

# テストを実行してエラーを確認します。
npm test

# すべてのスナップショットを更新します。
npm test -- -u

変更点を確認します。React 19のスナップショットには、次のような違いがあることが想定されます。

  • コンポーネントラッパー構造の変更
  • 属性の順序の違い
  • テキストノードのレンダリングの変更
  • 非同期境界の更新

コミットする前に、git diffを使用してスナップショットの変更点を確認してください。


Last updated: 2026年7月9日