Как узнать, что Detox проводит тесты?
Я использую Detox для запуска сквозных тестов в своем проекте React Native. Я также использую pretender.js для макетирования моих запросов API и пытаюсь найти способ узнать, находится ли приложение в данный момент в режиме "тестирования".
Я передавал переменную env вниз (и используя babel-transform-inline-environment-variables
), чтобы сказать, если я должен высмеивать запросы, но это ломает shim.js
в наших выпусках.
Есть ли способ сказать, что Detox запустил приложение и выполняет тесты изнутри JS? В идеале я ищу какой-то набор переменных во время теста или что-то переданное из командной строки (TESTING=true react-native start
или же __TESTING__
)
4 ответа
Попробуйте использовать response-native-config. Здесь также есть хорошая статья об управлении конфигурацией в React Native с помощью response-native-config.
Я также дал здесь ответ /questions/34033091/animirovannyie-knopki-blokiruyut-detoks с рабочим примером того, как response-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"
}
}
}
Мы используем тот факт, что детокс вызывает ваш двоичный файл с --args -detoxServer ... -detoxSessionId ...
в командной строке iOS и { detoxServer: ..., detoxSessionId: ... }
установить в InstrumentationRegistry в Android.
То, как мы сейчас представляем это в JS, немного похоже на ответ Stackru, но вот пример кода, который вместе с документами о реагировании должен помочь вам - для 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.init(config, { launchApp: false });
device.launchApp({ newInstance: true, launchArgs: {
myCustomArg: value,
...,
} });
Было бы здорово в какой-то момент довести это до модуля.
Тесты / производственный код, который имеет знания об окружающей среде, является беспорядочным IMO.
Я рекомендую делать это, создавая другой вариант приложения для тестирования.
Если вы используете React Native, ознакомьтесь с инструкциями response-native-repackager. Кроме того, в Detox docs есть и этот раздел. Если вы пишете код Java для Android, используйте варианты сборки gradle для создания вариантов тестирования.
Вы можете узнать больше о том, как мы издеваемся в наших E2E-пакетах, здесь.
React-native-is-detox работает как шарм!
Монтаж
yarn add react-native-is-detox
Использование (асинхронное)
import { isDetox } from 'react-native-is-detox';
// ...
const result = await isDetox();
console.log('Was app launched by Detox?', result);
.
import { isDetox } from 'react-native-is-detox';
function App() {
useEffect(() => {
isDetox().then((result) => {
console.log('Was app launched by Detox?', result);
});
}, []);
return <MyApp />;
}
Использование (синхронизация)
import { isDetoxSync } from 'react-native-is-detox';
const result = isDetoxSync();
console.log('Was app launched by Detox?', result);
.
import { isDetoxSync } from 'react-native-is-detox';
function App() {
useEffect(() => {
const result = isDetoxSync();
console.log('Was app launched by Detox?', result);
}, []);
return <MyApp />;
}
Мок-модуль в Jest Импортируйте response-native-is-detox/jestSetup в свой установочный файл Jest.
import 'react-native-is-detox/jestSetup';
Спасибо user6886817
Ссылка: Раздел комментариев.