13

我正在使用Detox在我的 React Native 项目中运行端到端测试。我还在使用predicter.js 来模拟我的API 请求,我正在努力寻找一种方法来了解应用程序当前是否处于“测试”模式。

我正在向下传递一个 env 变量(并使用babel-transform-inline-environment-variables)来告诉我是否应该模拟请求,但这会破坏shim.js我们的发布版本。

有什么方法可以告诉 Detox 启动了应用程序并在 JS 中运行测试?理想情况下,我正在寻找在测试时设置的某种变量或从命令行(TESTING=true react-native start__TESTING__)传递的东西

4

3 回答 3

11

尝试使用react-native-config。这里还有一篇关于使用 react-native-config在 React Native 中管理配置的好文章。

我还在这里给出了一个答案,animated-button-block-the-detox以及如何在测试期间使用 react-native-config 来禁用循环动画​​的工作示例。

基本思想是为所有不同的构建环境(开发、生产、测试​​等)创建 .env 配置文件。这些包含您可以从 Javascript、Objective-C/Swift 或 Java 访问的配置变量。

然后在构建应用程序时指定要使用的 .env 配置文件:

$ ENVFILE=.env.staging react-native run-ios # bash

这是一个 package.json 文件的示例,其中 detox 使用 .env 配置文件来构建应用程序。

"detox": {
  "specs": "e2e",
  "configurations": {
    "ios.sim.release": {
      "binaryPath": "ios/build/Build/Products/Release-iphonesimulator/example.app",
      "build": "ENVFILE=.env.production export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project ios/example.xcodeproj -scheme example -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
      "type": "ios.simulator",
      "name": "iPhone 5s, iOS 10.3"
    },
    "ios.sim.test": {
      "binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
      "build": "ENVFILE=.env.testing xcodebuild -project ios/example.xcodeproj -scheme example -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build -arch x86_64",
      "type": "ios.simulator",
      "name": "iPhone 5s, iOS 10.3"
    }
  }
}
于 2017-12-15T03:01:08.747 回答
4

我们正在利用 detox--args -detoxServer ... -detoxSessionId ...在 iOS 命令行上调用您的二进制文件并{ detoxServer: ..., detoxSessionId: ... }在 android 的 InstrumentationRegistry 中设置这一事实。

我们目前将其暴露给 JS 的方式对于 StackOverflow 答案来说有点多,但这里有一些示例代码,连同 react native 的文档应该可以让你到达那里 - 对于 Android:

// This will throw ClassNotFoundException if not running under any test,
// but it still might not be running under Detox
Class<?> instrumentationRegistry = Class.forName("android.support.test.InstrumentationRegistry");
Method getArguments = instrumentationRegistry.getMethod("getArguments");
Bundle argumentsBundle = (Bundle) getArguments.invoke(null);

// Say you're in your BaseJavaModule.getConstants() implementation:
return Collections.<String, Object>singletonMap("isDetox", null != argumentsBundle.getString("detoxServer"));

在 iOS 上,类似(没有 Objective-C 编译器 ATM):

return @{@"isDetox": [[[NSProcessInfo processInfo] arguments] containsObject: @"-detoxServer"]}

请注意,也可以使用 detox 添加您自己的参数:

detox.init(config, { launchApp: false });
device.launchApp({ newInstance: true, launchArgs: {
  myCustomArg: value,
  ...,
} });

在某个时候将其完善为一个模块会很棒。

于 2018-05-04T02:06:05.220 回答
2

了解环境的测试/生产代码是混乱的 IMO。
我建议这样做的方式是为测试创建不同的应用程序风格

如果您使用 React Native,请查看react-native-repackager的说明。或者,排毒文档也有该部分。如果您为 Android 编写 Java 代码,请使用 gradle build flavor 来创建用于测试的风味。

您可以在此处找到更多关于我们如何在 E2E 套件中进行模拟的信息。

于 2018-05-06T08:27:38.160 回答