Complex Assertions

Definition:

  • The assertions in a test require many lines of code to implement. At first blush, since test-scoped logic is typically itself untested, this can be risky. Additionally, multi-line assertions are typically harder to read—both in terms of what they’re doing and what they intend to say about the subject’s behavior.

Code Example:

// Subject under test
var _ = require('lodash')
function incrementAge (people) {
  return _(_.cloneDeep(people)).map(function (person) {
    if (_.isNumber(person.age)) {
      person.age += 1
    }
    if (_.isArray(person.kids)) {
      person.kids = incrementAge(person.kids)
    }
    return person
  }).shuffle().value()
}

// Test
module.exports = {
  incrementsSinglePersonAge: function () {
    var people = [
      {name: 'Jane', age: 39},
      {name: 'John', age: 99}
    ]
    var results = incrementAge(people)

    var jane = _.find(results, function (person) { return person.name === 'Jane' })
    assert.equal(jane.age, 40)
    var john = _.find(results, function (person) { return person.name === 'John' })
    assert.equal(john.age, 100)
  },
  incrementsKidsAgeToo: function () {
    var people = [
      {
        name: 'Joe',
        age: 42,
        kids: [
          {name: 'Jack', age: 8},
          {name: 'Jill', age: 7}
        ]}
    ]

    var results = incrementAge(people)

    var jack = _.find(results[0].kids, function (person) {
      return person.name === 'Jack'
    })
    assert.equal(jack.age, 9)
    var jill = _.find(results[0].kids, function (person) {
      return person.name === 'Jill'
    })
    assert.equal(jill.age, 8)
  }
}

References:

Quality attributes

  • - Code Example

  • - Cause and Effect

  • - Frequency

  • - Refactoring