【问题标题】:How to Assert a array contains a sub string in JavaScript/TScript如何断言数组包含 JavaScript/TYPEScript 中的子字符串
【发布时间】:2021-03-30 11:52:11
【问题描述】:

我正在尝试检查数组中是否存在 SubString。在测试中我断言使用:

expect(classList).toContain('Rail__focused')

我收到以下错误:

Error: expect(received).toContain(expected // indexOf
Expected value: "Rail__focused"
Received array: ["Rail__item__3NvGX", "Rail__focused__3bGTR", "Tile__tile__3jJYQ", "Tile__wide__1GuVb", "Tile__animated__3H87p", "Tile__active__1mtVd"]

这就是我想要实现的目标并希望它通过

var arr = ["Rail__item__3NvGX", "Rail__focused__3bGTR", "Tile__tile__3jJYQ", "Tile__wide__1GuVb", "Tile__animated__3H87p", "Tile__active__1mtVd"];
 
var str =  'Rail__focused';
for (var i = 0, len = arr.length; i < len; ++i) {
    if (str.indexOf(arr[i]) != -1) {
        console.log("This is a pass")
    } else {
    console.log("This is a fail")
    }
}

【问题讨论】:

  • 您还没有告诉我们您使用的是哪个断言库
  • @JLRishe 添加了断言类型的截图
  • 您可以编写自己的函数来进行检查并返回一个布尔值并使用真实性断言来代替
  • @MNB 截图对我们帮助不大。请给出断言库的名称
  • 你应该分享可重现的代码而不是图片

标签: javascript typescript webdriver-io


【解决方案1】:

所以因为屏幕截图中有一个 Jest d.ts - 我只是假设这是 Jest :)

.contain does a strict === 检查 - 所以这不适用于部分字符串。

例如,您可以在数组中搜索项目并断言它存在:

test('contain', () => {
  const classList = [
    'Rail__item__3NvGX',
    'Rail__focused__3bGTR',
    'Tile__tile__3jJYQ',
    'Tile__wide__1GuVb',
    'Tile__animated__3H87p',
    'Tile__active__1mtVd',
  ];
  expect(classList.find((el) => el.includes('Rail__focused'))).toBeDefined();
});

Array.find 会返回第一个满足回调结果的元素。它将返回 undefined - 如果没有找到。

如果这是一个重复的任务 - 你可以写一个custom matcher in Jest

expect.extend({
  toPartiallyContain(received, needle) {
    const pass = received.find((el) => el.includes(needle));
    if (pass) {
      return {
        message: () =>
          `expected ${received} not to partially contain ${needle}`,
        pass: true,
      };
    } else {
      return {
        message: () => `expected ${received} to partially contain ${needle}`,
        pass: false,
      };
    }
  },
});

test('contain with custom matcher', () => {
  const classList = [
    'Rail__item__3NvGX',
    'Rail__focused__3bGTR',
    'Tile__tile__3jJYQ',
    'Tile__wide__1GuVb',
    'Tile__animated__3H87p',
    'Tile__active__1mtVd',
  ];
  expect(classList).toPartiallyContain('Rail__focused');
  expect(classList).not.toPartiallyContain('Hello');
});

您的示例没有测试断言:

var arr = ["Rail__item__3NvGX", "Rail__focused__3bGTR", "Tile__tile__3jJYQ", "Tile__wide__1GuVb", "Tile__animated__3H87p", "Tile__active__1mtVd"];
 
var str =  'Rail__focused';

console.log(arr.find((el) => el.includes(str)));
   

【讨论】:

  • 谢谢并用代码 sn-p 更新了我的问题
  • 当我使用 find ^^^ 时得到Property find' does not exist on type 'string | number | boolean | object'. Property 'find' does not exist on type 'string'.ts(2339)
  • @MNB 那么你没有在数组上使用它;)。我用你的示例代码更新了我的答案。
  • 优秀的@madflow。这工作const allRailItems = $$(this.selectors.railItem); const classList: any = allRailItems[railItemPosition].getProperty('classList'); const expected_focus_string = 'Rail__focused'; const expected_active_string = 'Tile__active' expect(classList.find((el) =&gt; el.includes(expected_focus_string))).toBeDefined(); expect(classList.find((el) =&gt; el.includes(expected_active_string))).toBeDefined(); return this;
猜你喜欢
  • 1970-01-01
  • 2017-10-15
  • 2019-10-25
  • 2019-03-15
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多