如何在 Detox 中添加像 not.toHaveText 这样的否定断言?

How to add negative assertions like not.toHaveText in Detox?

我需要为一些文本内容设置否定并尝试了下面的代码,但由于文档中没有说明,我预计它会失败,而且确实失败了,所以我想知道我怎么可能实现在这种情况下否定。

await expect(element(by.id('myElemId'))).not.toHaveText('some text')

不幸的是,我不认为 Detox 有能力使用 .not 属性 of expect

但是你可以这样做:

首先创建一个函数,如果特定的文本短语存在,return它是一个布尔值。我们使用的事实是,如果一个值不存在,它将抛出错误,通过将其包装在 try/catch 中,我们可以 return 一个布尔值,然后我们可以在我们的测试中使用它。

async function hasText (id, text) {
  try {
    await expect(element(by.id(id))).toHaveText(text);
    return true;
  } catch (err) {
    return false;
  }
}

然后您可以按以下方式使用它,如果它 return 具有文本是正确的,则抛出错误。

it('should not have some text', async () => {
  await expect(element(by.id('myElemId'))).toBeVisible();
  let result = await hasText('myElemId', 'some text');
  // so if the text exists it will return true, as we don't want it to exist then we can throw our own error.
  if (result) {
    throw new Error('Should not have some text, but did.');
  }
});

我知道这不是解决问题的优雅方法,如果 Detox 为我们提供所需的 API 会更好,但我想这可以在紧要关头使用。

从 Detox 版本 17.11.4 开始,您可以执行此操作

await expect(element(by.id(options.testID))).toBeNotVisible()

await expect(element(by.text(options.text))).toBeNotVisible()

这是使用 Jest 推荐设置的正确方法。