Я пытаюсь проверить, что 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 добавил скриншот типов утверждений
Вы можете написать свою собственную функцию, которая выполняет проверку и возвращает логическое значение, и вместо этого использовать утверждение правдоподобия.
@MNB Скриншот нам мало помогает. Подскажите название библиотеки утверждений, пожалуйста
Вы должны делиться воспроизводимым кодом вместо изображений
Так как на скриншоте есть 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)));
Спасибо и обновили мой вопрос фрагментом кода
Я получаю Property find' does not exist on type 'string | number | boolean | object'. Property 'find' does not exist on type 'string'.ts(2339), когда использую find ^^^
@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) => el.includes(expected_focus_string))).toBeDefined(); expect(classList.find((el) => el.includes(expected_active_string))).toBeDefined(); return this;
Вы не сказали нам, какую библиотеку утверждений вы используете