Robert Mosolgo
🚦
📈
📖
🐛🔨
💰
# in addition.rb
class Addition 
  def initialize(inputs: )
    @inputs = inputs 
  end
  def value 
    sum = 0
    @inputs.each { |input| sum += input }
    sum 
  end 
end# in addition_test.rb
class AdditionTest < Minitest::Test
  def setup 
    @numbers = [1, 2, 3]
  end
  def test_result_equals_the_sum 
    addition = Addition.new(input: @numbers)
    value = addition.value 
    assert(value == 6)
  end
endTest case
Fixtures
Assertion
MMaaS
class BadExpression
  def initialize(operation_name, inputs)
    @operation_name = operation_name
    @inputs = inputs
  end
  def value
    method_name = "calculate_"+ @operation_name
    send(method_name)
  end
  private
  def calculate_largest_even
    @inputs
      .select {|i| i % 2 == 0}
      .max
  end
  def calculate_double
    calculate_addition * 2
  end
  def calculate_addition
    @inputs.reduce(&:+)
  end
endclass BadExpressionTest < Minitest::Test
  def setup
    @inputs = [2,3,4]
  end
  def test_it_does_addition
    # ...
  end
  def test_it_does_multiplication
    # ...
  end
  def test_it_does_double
    # ...
  end
  def test_it_does_largest_even
    # ...
  end
end# Return the largest multiple of 2 
# from the inputs
class LargestEven
  EVEN_NUMBERS = [
    2,  4,  6,  8, 10,
   12, 14, 16, 18, 20,
  ]
  def initialize(inputs: )
    @inputs = inputs
  end
  def value
    evens = @inputs & EVEN_NUMBERS 
    evens.max
  end
  private_constant :EVEN_NUMBERS
end
class LargestEvenTest < Minitest::Test
  def setup
    @numbers = [2, 3, 4, 5]
  end
  def test_result_equals_the_sum
    addition = LargestEven.new(
      inputs: @numbers
    )
    value = addition.value
    assert_equal(4, value)
  end
end# Return the largest multiple of 2 
# from the inputs
class LargestEven
  def initialize(inputs: )
    @inputs = inputs
  end
  def value
    evens = @inputs.select { |i| i.even? }
    evens.max
  end
end
class LargestEvenTest < Minitest::Test
  def setup
    @numbers = [2, 3, 4, 5]
    @large_numbers = [
      100, 505, 600, 437
    ]
  end
  def test_result_equals_the_sum
    addition = LargestEven.new(
      inputs: @numbers
    )
    value = addition.value
    assert_equal(5, value)
  end
  def test_result_may_be_very_large
    addition = LargestEven.new(
        inputs: @large_numbers
    )
    value = addition.value
    assert_equal(600, value)   
  end
end👶💭 🔜
💁 🔜
👴❓
👬👫
Short, fast, readable tests 😊
Small units of work 🔨
Insulated behaviors 🔐
Comprehensive tests 🚦
Living documentation 📖
Confident changes 📈
Kent Beck, "RIP, Test-Driven Development"
Test Framework of Your Choice