The React Native repo has several tests you can run to verify you haven't caused a regression with your PR. These tests are run with the Travis and CircleCI continuous integration systems, and will automatically post the results to your PR.
We don't have perfect test coverage of course, especially for complex end-to-end interactions with the user, so many changes will still require significant manual verification, but we would love it if you want to help us increase our test coverage and add more tests and test cases!
Jest tests are JS-only tests run on the command line with node. The tests themselves live in the
__tests__ directories of the files they test, and there is a large emphasis on aggressively mocking out functionality that is not under test for failure isolation and maximum speed. You can run the existing React Native jest tests with
from the react-native root, and we encourage you to add your own tests for any components you want to contribute to. See
getImageSource-test.js for a basic example.
To use Jest for your react-native projects we recommend following the React-Native Tutorial on the Jest website.
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:
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:
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 sets up the ReactNative environment and provides facilities to run the tests as
XCTestCases 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:expectErrorBlock: which will expect an error to be thrown and verify the error matches the provided criteria. See
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.
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.
You can edit the content above on GitHub and send us a pull request!