TL; DR
При использовании toMatchSnapshot
сопоставление toJSON
вызывается для объекта, переданного в expect
. Это часть некоторой цепочки проверок, которая может оказать незначительное, в подавляющем большинстве реальных случаев, влияние на производительность. Я бы предложил назвать toJSON
просто для следования принципу «явный лучше, чем неявный», и тот факт, что внутреннее поведение может быть изменено.
Объяснение
matcher использует SnapshotStates match
метод , который сериализует объект. serialize
просто вызывает pretty-format с набором плагинов.
Это точка входа в pretty-format , я добавил туда комментарии:
function prettyFormat(
val: unknown,
options?: PrettyFormat.OptionsReceived,
): string {
if (options) {
validateOptions(options);
if (options.plugins) {
const plugin = findPlugin(options.plugins, val);
/* When val is a result of `toJSON` call
it has a $$typeof: Symbol.for('react.test.json') field so
it is handled by ReactTestComponent plugin in this point */
if (plugin !== null) {
return printPlugin(plugin, val, getConfig(options), '', 0, []);
}
}
}
// When `toJSON` is not called `printBasicValue` is invoked but is it pointless
const basicResult = printBasicValue(
val,
getPrintFunctionName(options),
getEscapeRegex(options),
getEscapeString(options),
);
if (basicResult !== null) {
return basicResult;
}
return printComplexValue(val, getConfig(options), '', 0, []);
}
printBasicValue
просто выполняет набор проверок, все они терпят неудачу для объекта, поэтому printComplexValue
вступает в свою очередь. Вот фрагмент, где вызывается .toJSON()
.
if (
config.callToJSON &&
!hitMaxDepth &&
val.toJSON &&
typeof val.toJSON === 'function' &&
!hasCalledToJSON
) {
return printer(val.toJSON(), config, indentation, depth, refs, true);
}
printer
находит плагин и вызывает его в самом начале, так что это не имеет значения.
const plugin = findPlugin(config.plugins, val);
if (plugin !== null) {
return printPlugin(plugin, val, config, indentation, depth, refs);
}
Вы можете обратите внимание, что вызов toJSON
может быть отключен установкой параметра конфигурации или некоторыми другими условиями, которые, я считаю, не имеют значения для случая моментального снимка, но все же.