Как подтвердить, что массив содержит подстроку в JavaScript/TScript

Я пытаюсь проверить, что 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.info("This is a pass")
    } else {
    console.info("This is a fail")
    }
}

Вы не сказали нам, какую библиотеку утверждений вы используете

JLRishe 20.12.2020 14:49

@JLRishe добавил скриншот типов утверждений

MNB 20.12.2020 15:05

Вы можете написать свою собственную функцию, которая выполняет проверку и возвращает логическое значение, и вместо этого использовать утверждение правдоподобия.

old greg 20.12.2020 15:19

@MNB Скриншот нам мало помогает. Подскажите название библиотеки утверждений, пожалуйста

Chayim Friedman 20.12.2020 15:22

Вы должны делиться воспроизводимым кодом вместо изображений

captain-yossarian from Ukraine 20.12.2020 15:39
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
6
5
2 641
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так как на скриншоте есть Jest d.ts - я просто предполагаю, что это Jest :)

.contain выполняет строгую === проверку — так что это не будет работать с частичными строками.

Вы можете, например, найти элемент в массиве и подтвердить, что он существует:

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 - если ничего не найдено.

Если это повторяющаяся задача — вы можете написать кастомный сопоставитель в 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.info(arr.find((el) => el.includes(str)));
   

Спасибо и обновили мой вопрос фрагментом кода

MNB 20.12.2020 16:23

Я получаю Property find' does not exist on type 'string | number | boolean | object'. Property 'find' does not exist on type 'string'.ts(2339), когда использую find ^^^

MNB 20.12.2020 16:47

@MNB Тогда вы не используете его в массиве;). Я обновил свой ответ вашим примером кода.

madflow 20.12.2020 17:02

Отлично @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) => el.includes(expected_focus_string))).toBeDefined(); expect(classList.find((el) => el.includes(expected_active_string))).toBeDefined(); return this;

MNB 20.12.2020 20:02

Другие вопросы по теме