Load redux在排毒测试中存储初始状态

AFG*_*azy 11 react-native redux react-redux redux-store detox

问题

我们有一个非常复杂的应用程序,我们不希望在每个测试用例中完成整个过程以到达特定的屏幕来测试它,或者我们只想跳转到具有存储在redux存储中的某个状态的特定应用程序.


我尝试

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

  1. 为redux store创建initialState,其中包含我正在测试的屏幕的所有详细信息.
  2. 通过在其中指定-f标志,创建mocha.opts以仅运行此测试用例.
  3. 创建.env.test.screenX文件,它将告诉商店根据我选择的ENVFILE加载哪个初始状态.
  4. 在排毒中为每个屏幕创建不同的配置,以便它可以通过detox CLI加载正确的mocha opts.
  5. 每次我运行命令ENVFILE = env.test.screenX react-native run-ios所以项目将使用这个配置构建,然后我可以运行detox测试-c.



我的方法是如此复杂,需要很多设置和开销来运行每个屏幕的测试,所以我想知道是否有任何人有相同的问题,我怎么能解决它?一般来说,如何在排毒中处理反应原生线程?

min*_*meh 5

我认为排毒无法在运行时与本机线程进行通信并更改状态,因此我想到了一个使用Leo Natan提到的使用模拟技术的小技巧,这可能对您有用

您可以用一个屏幕(App.e2e.js)来模拟您的App.js文件,该屏幕上有一些带有已知testID的按钮,每个按钮分派加载特定状态以存储所需的所有操作,您可以通过按以下任一按钮来启动每个测试套件方法中的按钮,beforeEach然后您可以开始正常的测试流程

例如:

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

App.e2e.js具有2个按钮:

  • 一个用于身份验证的调度动作,例如 onAuthenticationSuccess(user, authToken)
  • 另一个导航到该屏幕 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
  });
});
Run Code Online (Sandbox Code Playgroud)