15

問題

非常に複雑なアプリケーションがあり、各テスト ケースでプロセス全体を実行して特定の画面に移動してテストする必要はありません。代わりに、状態が redux ストアに保存されている特定の画面にジャンプしたいだけです。


私が試し

たのは、特定の画面をロードする複数の初期状態を作成して直接テストできるようにし、デトックス テストの実行ごとに異なる mocha.opts をロードしてテスト ケースのこの部分を選択し、「react-native-config」を使用したことです。実行ごとに異なる状態をロードできるため、たとえば画面をロードするには、次のようにします。

  1. 現在テストしている画面のすべての詳細を含む redux ストアの initialState を作成します。
  2. -f フラグを指定して、このテスト ケースのみを実行する mocha.opts を作成します。
  3. 選択した ENVFILE に従ってどの初期状態をロードするかをストアに伝える .env.test.screenX ファイルを作成します。
  4. detox の各画面に異なる構成を作成して、detox CLI を介して正しい mocha opts をロードできるようにします。
  5. コマンド ENVFILE=env.test.screenX react-native run-ios を実行するたびに、この構成を使用してプロジェクトがビルドされ、デトックス テスト -c を実行できます。

質問

私の方法は非常に複雑で、各画面でテストを実行するために多くのセットアップとオーバーヘッドが必要になるため、同じ問題が発生したかどうか、どうすれば解決できるか疑問に思っていました。一般に、デトックスで反応するネイティブスレッドをどのように処理できますか?

4

2 に答える 2

8

デトックスが実行時に反応するネイティブスレッドと通信して状態を変更できる方法はないと思うので、レオナタンが述べたように、モックテクニックを使用する小さなハックを考えました。あなたの場合に役立つかもしれません

既知の testID を持ついくつかのボタンを持つ画面 (App.e2e.js) で App.js ファイルをモックすることができます。各ボタンは、特定の状態をロードして保存するために必要なすべてのアクションをディスパッチします。メソッドのボタンをクリックすると、beforeEachその後通常のテストフローを開始できます

例えば:

遠く離れた画面 (ユーザーが実際にアプリを使用するときに到達するにはあまりにも多くのクリックが必要) をテストし、認証が必要な場合は、次の構造にすることができます。

App.e2e.js には 2 つのボタンがあります。

  • 次のようなアクションをディスパッチする認証用のものonAuthenticationSuccess(user, authToken)
  • その画面へのナビゲーション用にもう 1 つthis.navigation.navigate("screenName")

test.js

describe("Screen work as intended", () => {
  beforeEach(async () => {
    await device.reloadReactNative();
    await element(by.id("authButtonID")).tap();
    await element(by.id("navigateButtonID")).tap();
  });

  it("should do something", async () => {
    //user is loaded in store
    //current screen is the screen you want to test
  });
});
于 2018-03-28T07:03:00.380 に答える
0

If you are using Expo and it's release-channels for specifying the environment, here is what you could do:

  1. Create a method resetStorage like suggested here: How to reset the state of a Redux store? (which you could have already implemented in logout)
  2. In App.js import resetStorage method
  3. In App.js add: import { Constants } from 'expo'
  4. Then add a button with testID="resetStorageBtn" to your render method which you can use for testing purposes and which won't be visible in production release-channel. So render might look similar to this:

    return (
      <Root>
        {Constants.manifest.releaseChannel !== 'production' &&
            (<View>
              <Button onPress={() => resetStorage()} testID="resetStorageBtn">
                <Text>Reset storage</Text>
              </Button>
            </View>
          )}
        <View>
          <AppNavigator />
        </View>
      </Root>
    );
    
于 2019-02-05T19:42:12.643 に答える