Text
Page: 1
Self-testing Code in
Ruby
Giovanni Sakti
Starqle
Page: 2
What is Self-testing code?
Page: 3
Self-testing code
Code that have built-in tests
The tests serve as a binding contract
The tests can be run arbitrarily
Page: 4
What is TDD? How it differs from self-
testing code?
Page: 5
TDD
Practices of writing tests before the
code
Ensure that the code is self-tested
It is, however, optional to do TDD to
write self-testing code
Page: 6
TDD
But some companies enforce TDD
because TDD enforces YAGNI principle
Page: 7
TDD
We'll see why...
Page: 8
TDD Steps
Write a test
Run the test, it should fail
Write code just enough to pass the
test
Run the test
Repeat
Page: 9
TDD & YAGNI
Because we only write just enough code
to pass the test, there will be no
unnecessary codes
Page: 10
Test in Ruby
There are several tools for doing testing
in ruby
Page: 11
Test in Ruby
RSpec
Minitest
test-unit
Page: 12
Test in Ruby
Let's try using RSpec
Page: 13
RSpec Install
% gem install rspec
Page: 14
RSpec Help
% rspec --help
Page: 15
Now let's do TDD practice using RSpec
Page: 16
TDD with RSpec (1)
Create a simple test of program that we
want to create
# game_spec.rb
RSpec.describe Game do
describe "#score" do
it "returns 0 for new game" do
game = Game.new
expect(game.score).to eq(0)
end
end
end
Page: 17
TDD with RSpec (2)
Run the example and watch it fail
% rspec game_spec.rb
uninitialized constant Object::Game (NameError)
Page: 18
TDD with RSpec (3)
Now write just enough code to make it
pass
# game.rb
class Game
attr_reader :score
def initialize
@score = 0
end
end
Page: 19
TDD with RSpec (3)
Now write just enough code to make it
pass
# game_spec.rb
require './game'
...
Page: 20
TDD with RSpec (4)
Run the example and the test shall pass
% rspec game_spec.rb --color --format doc
Game
#score
returns 0 for all gutter game
Finished in 0.00057 seconds
1 example, 0 failures
Page: 21
TDD with RSpec (5)
Repeat with new features