2017-12-31 51 views
1

React Native/TypeScript 앱에 대한 단위 테스트를 작성하고 싶습니다. 문제는 일부 라이브러리가 'AsyncStorage'또는 'react-native-sqlite-2'라이브러리와 같이 개발 환경에서 실행되지 않는다는 것입니다.React Native의 비 컴포넌트 테스트 (Non-component unit tests)

내가 Jest 웹 사이트에서 발견 한 유일한 것은 조롱에 관한 것이지만 이것은 UI 테스트를 분리하는 방법 일뿐입니다.

나는 node.js 라이브러리를 사용하여 이러한 라이브러리를 시뮬레이션하고 환경에 따라 올바른 라이브러리를로드 할 생각을하고있었습니다. 같은

뭔가 :

if(isDevelopment) { 
    SQLiteDatabase = require("./sqlite_database_node").SQLiteDatabaseNode; 
} 
else { 
    SQLiteDatabase = require("./sqlite_database_rn").SQLiteDatabaseRN; 
} 

이이 문제에 대해 갈 수있는 올바른 방법인가? 그렇다면 수입/요구에 따라 어떻게 작동합니까? 그렇지 않다면 최선의 방법은 무엇입니까?

답변

3

Jest 또는 단위 테스트를 실행할 때. 테스트는 노드 환경에서 실행 중입니다. 따라서 네이티브 구성 요소/라이브러리 (예 : 비동기 저장소 또는 SQLite)가있는 모듈에 액세스하려고하면 코드가 test 환경에서 중단됩니다.

이 문제를 해결하기 위해 Jest는 모듈 mock을 고안했습니다. 내 프로젝트에서 내가하는 일은 내부적으로 네이티브 모듈을 사용하는 모든 node_module에 대한 것입니다.이 모듈을위한 글로벌 모의를 만듭니다.

당신에게 어쩌면 __mocks__/react-native-device-info

를 단순히 그렇게

. 
├── README.md 
├── __mocks__ 
│   ├── base-64.js 
│   ├── react-native-animatable.js 
│   ├── react-native-config.js 
│   ├── react-native-device-info.js 
│   ├── react-native-fetch-blob.js 
│   ├── react-native-firebase.js 
│   ├── react-native-google-analytics-bridge.js 
│   ├── react-native-map-markerclustering.js 
│   ├── react-native-maps.js 
│   ├── react-native-simple-download-manager.js 
│   ├── react-native-simple-toast.js 
│   ├── react-native-splash-screen.js 
│   ├── react-native-testfairy.js 
│   ├── react-native-version-number.js 
│   └── react-native.js 
├── __tests__ 
│   └── index.test.js 
├── app 
│   ├── App.container.js 
│   ├── __tests__ 
│   ├── assets 
│   ├── components 
│   ├── config 
│   ├── index.js 
│   ├── language 
│   ├── pages 
│   ├── redux 
│   ├── routes 
│   ├── themes 
│   └── utils 
├── app.json 
├── circle.yml 
├── index.js 
├── package.json 
└── yarn.lock 

같은 루트 디렉토리에 폴더 __mocks__을 만들어야 할 그리고 예를 들어

__mocks__/react-native-firebase.js

module.exports = { 
    crash:() => ({ 
    setCrashCollectionEnabled: jest.fn() 
    }), 
    auth:() => ({ 
    signInAnonymously: jest.fn() 
    }), 
    database:() => ({ 
    ref:() => ({ 
     on: jest.fn() 
    }) 
    }), 
    config:() => ({ 
    fetch: jest.fn(), 
    setDefaults: jest.fn(), 
    getValue: jest.fn() 
    }), 
    messaging: jest.fn(() => ({ 
    requestPermissions: jest.fn(), 
    subscribeToTopic: jest.fn(), 
    getToken: jest.fn(Promise.resolve), 
    onMessage: jest.fn(), 
    getInitialNotification: jest.fn(Promise.resolve), 
    onTokenRefresh: jest.fn() 
    })) 
}; 

볼 수 있습니다 또는하려면

const mockmod = jest.genMockFromModule('react-native-device-info'); module.exports = mockmod;

포인트가 자동으로 u는 조롱 모듈 실행해야합니다 앱의 ENV에 당신이있을 것이다 시험 ENV의 결과 유 require('react-native-device-info')

수행 할 때이 파일을 사용하는 것입니다 테스트 ENV의 농담 중에 ...입니다 실제 노드 모듈.