Jest.js 如何在最新版本中配置Detox生命周期挂钩?

9lowa7mx  于 2023-09-28  发布在  Jest
关注(0)|答案(1)|浏览(107)

我在17.13.2版本中运行detox,并将jest-circus作为测试运行程序。我的主要问题是应用程序在运行测试之后或之前都没有重置,这导致应用程序的状态不一致。
我的测试文件:

import { by, device, element, expect, waitFor } from "detox"

describe("Login", () => {
  beforeEach(async () => {
    await device.reloadReactNative()
  })

  it("should login with correct data", async () => {
    await element(by.id("login_email_input")).typeText("[email protected]")
    await element(by.id("login_password_input")).typeText("12345678")
    await element(by.id("login_submit_button")).tap()

    await waitFor(element(by.id("workout_screen"))).toBeVisible()

    // additional test steps

  })
})

现在,如果登录实际上工作,但在后续步骤之一测试失败,应用程序用户的状态仍然是“登录”。
据我所知,实际上不可能改变应用程序的状态,例如。通过清除AsyncStorage或直接与状态管理工具交互。相反,建议只是重新安装应用程序-但这正是我挣扎的地方。
我尝试了很多方法,没有一个奏效。是什么让我们很难理解configuration is that detox completely changed how the configuration works并切换到jest-circus作为主要测试运行程序。
我的设置基本上是由jest init -r jest创建的。据我所知,这已经包括了detox.init()detox.cleanup()的一些默认值:

{
  "detox": {
    "behavior": {
      "init": {
        "reinstallApp": true,
        "launchApp": true,
        "exposeGlobals": true
      },
      "cleanup": {
        "shutdownDevice": false
      }
    }
  }
}

但是,这似乎不足以在运行测试后实际擦除应用程序状态。
我尝试使用一个init脚本setupFilesAfterEnv,它将在测试套件运行后调用cleanup()。实际上,这在一个仍然使用jasmine 2作为测试运行器的旧项目中可以工作。

import { cleanup, init } from 'detox';
const adapter = require('detox/runners/jest/adapter');
const specReporter = require('detox/runners/jest/specReporter');

const config = require('../package.json').detox;

// Set the default timeout
jest.setTimeout(120000);

jasmine.getEnv().addReporter(adapter);

// This takes care of generating status logs on a per-spec basis. By default, jest only reports at file-level.
// This is strictly optional.
jasmine.getEnv().addReporter(specReporter);

beforeAll(async () => {
  await init(config, { launchApp: false });
}, 300000);

beforeEach(async () => {
  await adapter.beforeEach();
});

afterAll(async () => {
  await adapter.afterAll();
  await cleanup();
});

首先,它抱怨茉莉花没有定义。我猜这是因为实际上在这种情况下adapter应该是一个DetoxAdapterCircus,它不是,即使在我的配置文件中我指定:

{
    "preset": "react-native",
    "testEnvironment": "./environment.ts",
    "testRunner": "jest-circus/runner",
    "testTimeout": 120000,
    "testRegex": "\\.e2e\\.ts$",
    "reporters": ["detox/runners/jest/streamlineReporter"],
    "verbose": true
}

"testRunner": "jest-circus/runner"
另一个想法是改变CustomDetoxEnvironment,但我不明白我如何才能获得排毒生命周期挂钩。

const {
  DetoxCircusEnvironment,
  SpecReporter,
  WorkerAssignReporter,
} = require("detox/runners/jest-circus")

class CustomDetoxEnvironment extends DetoxCircusEnvironment {
  constructor(config) {
    super(config)

    // should I access the hooks here now?

    // This takes care of generating status logs on a per-spec basis. By default, Jest only reports at file-level.
    // This is strictly optional.
    this.registerListeners({
      SpecReporter,
      WorkerAssignReporter,
    })
  }
}

module.exports = CustomDetoxEnvironment

TL;DR:我不知道在最新版本的Detox中应该把我的可重用生命周期挂钩放在哪里。此外,我想知道是否需要这些自定义配置来重新安装应用程序并在每个测试套件之前擦除应用程序数据。

vfh0ocws

vfh0ocws1#

你仍然可以使用setupFilesAfterEnv,但你不应该像以前那样调用相同的hooks/cleanup(请参阅https://github.com/wix/Detox/issues/2410#issuecomment-744387707)。
下面是一个init脚本示例:

// init.ts
// with "setupFilesAfterEnv": ["./init.ts"] in the conf

beforeAll(async () => {
  // to reset the state
  await device.clearKeychain();

  // we are launching the app manually
  await device.launchApp({
    permissions: { notifications: 'YES', location: 'inuse' },
  });

  await device.setURLBlacklist([
    // ...
  ]);
});

相关问题