A report query object with nine constructor parameters, six of them nullable, called from four places with different subsets. Named arguments make the nine-parameter constructor tolerable, and tolerable…
Three packages in the same application, each with its own curl wrapper, each with its own idea of what a timeout means. The value is not the abstraction,…
A command with 80 lines in execute(), none of which could be called from anywhere else, including a test. The command should parse input, call one thing, and…
An event listener marked as queued, doing 20 seconds of PDF generation, and failing in a way that made the original event look like the problem. A queued…
Forty lines of proc_open wrapping, written in 2018, replaced by four — and the part that mattered was the testing. The wrapper had been correct and nobody wanted…
The February release types the application skeleton rather than the framework internals, which is a smaller change than the headline suggests and a useful one. Typing the skeleton…
PHPUnit 10 deprecates the docblock forms in favour of attributes, which is a mechanical change across every test file and a real improvement. Attributes are parsed by the…