Asserting against booleans makes error tracking more difficult.
TL;DR: Don't assert true unless you are checking a boolean
Problems
- Fail Fast Principle
Solutions
Check if the boolean condition can be rewritten better
Favor assertEquals
Context
When asserting to a boolean our test engines cannot help us very much.
They just tell us something failed.
Error tracking gets more difficult.
Sample Code
Wrong
<?
final class RangeUnitTest extends TestCase {
function testValidOffset() {
$range = new Range(1, 1);
$offset = $range->offset();
$this->assertTrue(10 == $offset);
//No functional essential description :(
//Accidental description provided by tests is very bad
}
}
// When failing Unit framework will show us
//
// 1 Test, 1 failed
// Failing asserting true matches expected false :(
// () <-- no business description :(
//
// <Click to see difference> - Two booleans
// (and a diff comparator will show us two booleans)
Right
<?
final class RangeUnitTest extends TestCase {
function testValidOffset() {
$range = new Range(1, 1);
$offset = $range->offset();
$this->assertEquals(10, $offset, 'All pages must have 10 as offset');
//Expected value should always be first argument
//We add a functional essential description
//to complement accidental description provided by tests
}
}
// When failing Unit framework will show us
//
// 1 Test, 1 failed
// Failing asserting 0 matches expected 10
// All pages must have 10 as offset <-- business description
//
// <Click to see difference>
// (and a diff comparator will help us and it will be a great help
// for complex objects like objects or jsons)
Detection
[X] SemiAutomatic
Some linters warn us if we are checking against boolean after setting this condition.
We need to change it to a more specific check.
Tags
- Test Smells
Conclusion
Try to rewrite your boolean assertions and you will fix the failures much faster.
Relations
More Info
Credits
Photo by Joël de Vriend on Unsplash
I've finally learned what 'upward compatible' means. It means we get to keep all our old mistakes.
Dennie van Tassel
This article is part of the CodeSmell Series.