doc/development/refactoring_guide/_index.md
This document is a collection of techniques and best practices to consider while performing a refactor.
Pinning tests help you ensure that you don't unintentionally change the output or behavior of the entity you're refactoring. This even includes preserving any existing buggy behavior, since consumers may rely on those bugs implicitly.
Leaving in the commits for adding and removing pins helps others check out and verify the result of the test.
AAAAAA Add pinning tests to funky_foo
BBBBBB Refactor funky_foo into nice_foo
CCCCCC Remove pinning tests for funky_foo
Then you can leave a reviewer instructions on how to run the pinning test in your MR. Example:
First revert the commit which removes the pin.
shellgit revert --no-commit $(git log -1 --grep="Remove pinning test for funky_foo" --pretty=format:"%H")Then run the test
shellyarn run jest path/to/funky_foo_pin_spec.js
It's hard for a refactor to be 100% pure. This means that a pin which captures absolutely everything is bound to fail with some trivial and expected differences. Try to keep the pins green by cleaning the pin with the expected changes. This helps others quickly verify that a refactor was safe.
// funky_foo_pin_spec.js
const cleanForSnapshot = el => {
Array.from(rootEl.querySelectorAll('[data-deprecated-attribute]')).forEach(el => {
el.removeAttribute('data-deprecated-attribute');
});
};
// ...
expect(cleanForSnapshot(wrapper.element)).toMatchSnapshot();