Summary: I was going to add an integration test and realized it would be useful to have an easy way to run these test locally. Added scripts and documented how to use them. **Test plan** `./scripts/run-android-local-unit-tests.sh` <img width="786" alt="screen shot 2016-05-04 at 3 55 26 pm" src="https://cloud.githubusercontent.com/assets/346214/15018667/7f4981cc-1212-11e6-9fcb-12493c29015c.png"> `./scripts/run-android-local-integration-tests.sh` <img width="772" alt="screen shot 2016-05-04 at 3 57 23 pm" src="https://cloud.githubusercontent.com/assets/346214/15018677/90b54810-1212-11e6-83d4-58530eb41d79.png"> Buck check by replacing `which buck` by `which duck` in the scripts: <img width="805" alt="screen shot 2016-05-04 at 4 09 37 pm" src="https://cloud.githubusercontent.com/assets/346214/15018696/aa008262-1212-11e6-9a22-173507cd771f.png"> Checked the website renders fine: `cd website; npm install; npm start` 
React Native uses the Buck build tool to run tests. Unit tests run locally on your machine, no emulator is needed. To run the tests:
$ cd react-native
$ ./scripts/run-android-local-unit-tests.sh
Integration tests (Android)
React Native uses the Buck build tool to run tests. Integration tests run on an emulator / device and verify that modules and components, as well as the core parts of React Native (such as the bridge) work well end-to-end.
Make sure you have the path to the Android NDK set up, see Prerequisites.
To run the tests:
$ cd react-native
$ npm install
$ ./scripts/run-android-local-integration-tests.sh
Integration Tests (iOS)
React Native provides facilities to make it easier to test integrated components that require both native and JS components to communicate across the bridge. The two main components are RCTTestRunner
and RCTTestModule
. RCTTestRunner
sets up the ReactNative environment and provides facilities to run the tests as XCTestCase
s in Xcode (runTest:module
is the simplest method). RCTTestModule
is exported to JS as NativeModules.TestModule
. The tests themselves are written in JS, and must call TestModule.markTestCompleted()
when they are done, otherwise the test will timeout and fail. Test failures are primarily indicated by throwing a JS exception. It is also possible to test error conditions with runTest:module:initialProps:expectErrorRegex:
or runTest:module:initialProps:expectErrorBlock:
which will expect an error to be thrown and verify the error matches the provided criteria. See IntegrationTestHarnessTest.js
, UIExplorerIntegrationTests.m
, and IntegrationTestsApp.js for example usage and integration points.
You can run integration tests locally with cmd+U in the IntegrationTest and UIExplorer apps in Xcode.
Snapshot Tests (iOS)
A common type of integration test is the snapshot test. These tests render a component, and verify snapshots of the screen against reference images using TestModule.verifySnapshot()
, using the FBSnapshotTestCase
library behind the scenes. Reference images are recorded by setting recordMode = YES
on the RCTTestRunner
, then running the tests. Snapshots will differ slightly between 32 and 64 bit, and various OS versions, so it's recommended that you enforce tests are run with the correct configuration. It's also highly recommended that all network data be mocked out, along with other potentially troublesome dependencies. See SimpleSnapshotTest
for a basic example.
If you make a change that affects a snapshot test in a PR, such as adding a new example case to one of the examples that is snapshotted, you'll need to re-record the snapshot reference image. To do this, simply change to _runner.recordMode = YES;
in UIExplorer/UIExplorerSnapshotTests.m, re-run the failing tests, then flip record back to NO
and submit/update your PR and wait to see if the Travis build passes.