React native 在解毒测试中加载redux存储初始状态

React native 在解毒测试中加载redux存储初始状态,react-native,redux,react-redux,detox,redux-store,React Native,Redux,React Redux,Detox,Redux Store,问题 我们有一个相当复杂的应用程序,我们不希望在每个测试用例中都经历整个过程,以到达特定的屏幕进行测试,或者我们只希望跳转到特定的屏幕,并在redux存储中存储一些状态 我所尝试的 我创建了多个初始状态,加载特定的屏幕,以便我可以直接测试它,对于每次排毒测试,我加载不同的mocha.opts来选择这部分测试用例,并使用“react native config”,以便我可以在每次运行中加载不同的状态,例如,对于加载屏幕,我将执行以下操作: 为redux商店创建initialState,其中包含我

问题

我们有一个相当复杂的应用程序,我们不希望在每个测试用例中都经历整个过程,以到达特定的屏幕进行测试,或者我们只希望跳转到特定的屏幕,并在redux存储中存储一些状态


我所尝试的

我创建了多个初始状态,加载特定的屏幕,以便我可以直接测试它,对于每次排毒测试,我加载不同的mocha.opts来选择这部分测试用例,并使用“react native config”,以便我可以在每次运行中加载不同的状态,例如,对于加载屏幕,我将执行以下操作:

  • 为redux商店创建initialState,其中包含我当前测试的屏幕的所有详细信息
  • Create mocha.opts通过在其中指定-f标志来仅运行此测试用例
  • 创建.env.test.screenX文件,该文件将根据我选择的env文件告诉存储要加载的初始状态
  • 在detox中为每个屏幕创建不同的配置,以便它可以通过detox CLI加载正确的摩卡选项
  • 每次我运行命令ENVFILE=env.test.screenX react native run ios时,都会使用此配置构建项目,然后我可以运行detox test-c

  • 问题


    我的方法非常复杂,需要大量的设置和开销来运行每个屏幕的测试,所以我想知道是否有人有相同的问题,我如何解决它?一般来说,我如何在detox中处理react本机线程?

    我认为detox无法在运行时与react本机线程通信并更改状态,因此我想到了一个使用上述模拟技术的小技巧,它在您的情况下可能很有用

    你可以用一个屏幕(App.e2e.js)来模拟你的App.js文件,这个屏幕上有一些带有已知测试的按钮。每个按钮分配加载特定状态所需的所有操作以存储,你可以通过按下
    beforeach
    方法中的一个按钮来启动每个测试套件,然后你就可以启动正常的测试流

    例如:

    如果您想测试距离较远的屏幕(当用户实际使用应用程序时需要太多的点击才能到达),并且需要身份验证,您可以采用以下结构:

    App.e2e.js有两个按钮:

    • 一个用于发送操作的身份验证,如
      onAuthenticationSuccess(用户,authToken)
    • 另一个用于导航到该屏幕
      this.navigation.navigate(“屏幕名”)
    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
      });
    });
    

    如果您使用的是Expo,并且它是用于指定环境的,那么您可以执行以下操作:

  • 创建一个方法
    resetStorage
    ,如下所示: (您可能已经在
    注销
    中实现了此功能)
  • 在App.js中导入
    resetStorage
    方法
  • 在App.js中添加:
    从“expo”导入{Constants}
  • 然后将带有
    testID=“resetStorageBtn”
    的按钮添加到您的
    render
    方法中,您可以使用该方法进行测试,并且该方法在产品发布频道中不可见。 因此,
    render
    可能与此类似:

    return (
      <Root>
        {Constants.manifest.releaseChannel !== 'production' &&
            (<View>
              <Button onPress={() => resetStorage()} testID="resetStorageBtn">
                <Text>Reset storage</Text>
              </Button>
            </View>
          )}
        <View>
          <AppNavigator />
        </View>
      </Root>
    );
    
    返回(
    {Constants.manifest.releaseChannel!=='production'&&
    (
    resetStorage()}testID=“resetStorageBtn”>
    重置存储器
    )}
    );
    

  • 没有真正的反应和排毒经验。但是在正常的react/redux应用程序中,您只需在每个测试用例中模拟redux存储,并使用您需要的状态。有什么原因不能在你的设置中在测试用例级别上解决吗?你也可以用解毒来模拟你的状态。阅读我们关于模仿的文档。@LeoNatan你能为我的案例提供具体链接吗,提前谢谢。它就在文档中:我没有关于你案例的具体信息。使用推荐的API来实现您想要的。好吧,但是如果我希望每个测试场景都有多个e2e文件,那么@LeoNatan是可行的