rogervinas / tests-everywhere
🤠 Tests, Tests Everywhere!
Ruby testing this simple Hello World with RSpec
Show me the code
Implementation
- Create
HelloMessage
class in HelloMessage.rb:
class HelloMessage
def text
@text = "Hello World!"
end
end
- Create
HelloConsole
class in HelloConsole.rb:
class HelloConsole
def print(text)
puts text
end
end
- Create
HelloApp
class in HelloApp.rb:
class HelloApp
def initialize(message, console)
@message = message
@console = console
end
def printHello
@console.print(@message.text)
end
end
- Create main function in Main.rb that wraps it all together:
message = HelloMessage.new
console = HelloConsole.new
app = HelloApp.new message, console
app.printHello
Test
Following RSpec Core and RSpec Mocks guides ...
- Test
HelloMessage
in HelloMessage_spec.rb:
RSpec.describe HelloMessage do
it "should return hello world" do
message = HelloMessage.new
expect(message.text).to eq("Hello World!")
end
end
- Test
HelloApp
in HelloApp_spec.rb:
RSpec.describe HelloApp do
it "should print hello message" do
messageText = "Hello Test!"
# 2.1 Create a mock of HelloMessage
# that will return "Hello Test!" whenever text is called
message = instance_double("HelloMessage", :text => messageText)
# 2.2 Create a mock of HelloConsole
console = instance_double("HelloConsole")
# 2.3 Expect print to be called once with "Hello Test!"
expect(console).to receive(:print).once.with(messageText)
# 2.4 Create a HelloApp, the one we want to test, passing the mocks
app = HelloApp.new message, console
# 2.5 Execute the method we want to test
app.printHello
# Expectation 2.3 will be checked once test ends
end
end
- Test output should look like:
HelloApp
should print hello message
HelloMessage
should return hello world
Finished in 0.00457 seconds (files took 0.05704 seconds to load)
2 examples, 0 failures
Happy Testing! 💙
Top comments (0)