#javascript #jestjs
#javascript #jestjs
Вопрос:
Я работаю над библиотекой arrow, где я создаю функцию, которая возвращает только элементы с типом Symbol
.
Я использую filter
функцию для массива :
export const extractSymbol = array => {
if (isArray(array)) {
return array.filter(value => typeof value === "symbol")
}
}
Но поскольку я создаю тесты перед реализацией, этот тест завершается неудачей :
expect(extractSymbol([1, 2, 4, Symbol('vue'), Symbol('react')])).toStrictEqual([Symbol('vue'), Symbol('react')]);
Я ожидал true, но он возвращает :
Expected: [Symbol(vue), Symbol(react)]
Received: serializes to the same string
Ответ №1:
Два символа, созданные с одним и тем же параметром, не равны друг другу:
console.log(
Symbol('foo') === Symbol('foo')
);
Чтобы тест работал правильно, определите символы вне expect
, чтобы вы могли передавать одну и ту же ссылку на оба массива:
const s1 = Symbol('vue');
const s2 = Symbol('react');
expect(extractSymbol([1, 2, 4, s1, s2])).toStrictEqual([s1, s2]);
Комментарии:
1. Тесты пройдены, но могу ли я узнать, в чем разница между созданием в массиве и вне массива, и что именно произошло?
2. С помощью
[Symbol('vue')], [Symbol('vue')]
вы вызвалиSymbol
дважды, поэтому символы разделены (не равны друг другу). Но сconst s = Symbol('vue'); compare([s], [s])
вы вызвалиSymbol
только один раз, поэтому созданный символ равен самому себе.3. Если посмотреть на это так, это немного похоже на objects:
{} !== {}
, ноconst obj = {}; obj === obj
Ответ №2:
Попробуйте это:
let arr = [Symbol('foo'), 123];
let filtered = arr.filter(x => typeof(x) == 'symbol');
console.log(filtered);
Комментарии:
1. К сожалению, тесты завершились неудачей, но в чем разница между
typeof
с()
ними и без них?2. typeof ‘example’ и typeof(‘пример’) являются допустимым синтаксисом
3. Но проблема не была связана с синтаксисом.
4. я имею в виду, что вы можете написать typeof со скобками или без них