Search code examples
react-nativedetox

How is detox code inserted into the app bundle


I use detox to run e2e tests on react native.

This artcile written by one of the people working on detox says

Gray box essentially uses a piece of code that is planted in the app, it can help us see what’s going on inside.

My question is, how does that happen? Looking at the docs the command used for detox build is

xcodebuild -project ios/YourProject.xcodeproj -scheme YourProject -sdk iphonesimulator -derivedDataPath ios/build

No detox-specific mention to be seen there.

Also, the docs state here that the build command is optional and that

You can also choose not to use it and provide a compiled app by yourself.

Well, how do I do that? How do I inject detox / make sure detox is not injected into my app? If I download compiled app from my CI server it does not work with detox (not surprisingly since the detox code is not planted into the app). But if I use the detox build command (which seem to just run whatever the build command in the config specifies), the tests work. There seems to be some "magic" happening which is not understandable for a newcomer.

Thanks.


Solution

  • It's magic!

    Well, actually it isn't. The build step is completely optional, and as stated in the documentation, Detox works with any valid app.

    In order to load Detox, we tell the dynamic linker to load it using the DYLD_INSERT_LIBRARIES environment variable. So it only loads Detox when you run detox test from the command line.

    This is easy on the simulator as it has access to your Mac's file system. Once we implement support for testing on actual hardware devices, we will still use that environment variable, but we will have to inject it inside your IPA file directly.