I'm using Detox to run end to end tests in my React Native project. I'm also using pretender.js to mock my API requests and I'm struggling to find a way to know if the app is currently in "testing" mode.
I was passing an env variable down (and using babel-transform-inline-environment-variables
) to tell if I should mock the requests but that breaks shim.js
in our release builds.
Is there any way to tell Detox launched the app & is running tests from within the JS? Ideally I'm looking for some sort of variable set at test time or something passed down from the command line (TESTING=true react-native start
or __TESTING__
)
Try using react-native-config. Here is also a good article on Managing Configuration in React Native with react-native-config.
I also gave an answer here animated-button-block-the-detox with working example of how react-native-config can be used to disable looping animations during testing.
The basic idea is that you create .env config files for all your different build environments (development, production, test, etc). These hold your configuration variables that you can access from either Javascript, Objective-C/Swift, or Java.
You then specify which .env config file to use when building your app:
And this is an example of package.json file where detox uses .env config files for building the app.
Tests/production code that has knowledge of the environment is messy IMO.
The way I recommend doing it is by creating different app flavour for testing.
If you use React Native, check out react-native-repackager's instructions. Alternatively, Detox docs have that section as well. If you write Java code for Android, use gradle build flavours to create a flavours for testing.
You can find more on how we mock in our E2E suites here.
We are taking advantage of the fact detox invokes your binary with
--args -detoxServer ... -detoxSessionId ...
on the iOS command line and{ detoxServer: ..., detoxSessionId: ... }
set in InstrumentationRegistry in android.The way we are currently exposing this to JS is a bit much for a StackOverflow answer, but here's some sample code that along with react native's docs should get you there - for Android:
And on iOS, something like (don't have an Objective-C compiler ATM):
Note it's also possible to get detox to add your own arguments with:
It would be great to get this polished up to a module at some point.