如何在 Detox 中添加诸如 not.toHaveText 之类的否定断言?

Posted

技术标签:

【中文标题】如何在 Detox 中添加诸如 not.toHaveText 之类的否定断言?【英文标题】:How to add negative assertions like not.toHaveText in Detox? 【发布时间】:2019-07-22 10:41:33 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

但是你可以这样:

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

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

然后,如果它返回 true 以获得文本,则可以通过以下方式使用它并引发错误。

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 会更好,但我想这可以在紧要关头使用。

【讨论】:

安德鲁,首先,我要感谢您帮助 Rainyer。另外,你的回答很重要。有人可以检查 Detox Github 问题中是否存在此功能请求吗?如果没有,你能做到吗,Andrew,Rainyer? 抱歉回复晚了。由于 lib 中不存在此功能,因此您的解决方案对我来说完全有意义,我可以轻松地将其作为实用程序功能导入到我需要的任何测试文件中,非常感谢您抽出一些时间来帮助 @Andrew。 @noomorph 我很乐意为此在 Detox 存储库中打开一个功能请求,因为这对于 lib api 来说是一个非常方便的功能。【参考方案2】:

从 Detox 版本 17.11.4 开始,您可以这样做

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

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

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

【讨论】:

以上是关于如何在 Detox 中添加诸如 not.toHaveText 之类的否定断言?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 Detox 在 React Native 中检查是不是选择或禁用了特定元素?

如何在 Detox 中启用 `debug` 运行 RN 测试?

Detox:如何使用 detox 在通知中心点击 iOS 推送通知

如何在 Detox 中控制 React-Native webview?

如何使用 Detox 在 Android 上的操作栏中点击三点菜单(更多选项)?