Code Smell 104 - Assert True

Code Smell 104 - Assert True

Maxi Contieri

Published on Nov 21, 2021

2 min read

Subscribe to my newsletter and never miss my upcoming articles

Listen to this article

Table of contents

  • Problems
  • Solutions
  • Context
  • Sample Code
  • Detection
  • Tags
  • Conclusion
  • Relations
  • More Info
  • Credits

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

  1. Check if the boolean condition can be rewritten better

  2. 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.

 
Share this