Test your app with RSpec
Created by Clemens Helm, @clemenshelm and Floor Drees, @floordrees
RSpec is a Ruby testing framework, that describes our application’s behavior in a syntax that doesn’t look much like Ruby. It outputs test results in your terminal, so you’ll test your reading skills as well (pun intended).
COACH: Talk about testing and Behavior-Driven Development.
Install rspec
For starters, let’s install RSpec and all of its dependencies.
gem install rspec
Then we call
rspec --init
in our project directory. This creates spec_helper.rb
in the spec folder, and .rspec
.
Rubyists often use the words ‘test’ and ‘specification’ interchangeably, that’s why you’ll store your tests in the ‘specs’ folder. Save your test as idea_spec.rb
(<name_of_spec>_spec.rb
).
Inside that new file, write:
require "spec_helper"
require "idea"
Next, let’s describe one of our specifications
describe Idea do
it "has a title" # your examples (tests) go here
end
In your terminal run
rspec spec/lib/idea_spec.rb
which will output that your test is pending as it’s not yet implemented.
COACH: Talk about googling terminal output.
Let’s do something about that!
describe Idea do
it "has a title" do # yep, you can totally use 'it'
idea = Idea.new # creating a new idea 'instance'
idea.title.should be_true # this is our expectation
end
end
should give you a more satisfying output.
Refactoring
You could actually also write:
describe Idea do
its(:title) { should be_true }
end
which looks a lot nicer, but there’s a lot of magic involved. For now it’s probably jyst nice to know that we can ‘refactor’ those big chuncks of code into smaller bits with a little more experience.
COACH: Talk a bit about refactoring.
Marking to-do’s with tests
Yeah! To-do lists. Awesome. A nifty RSpec feature is the functionality to mark certain tests as pending.
Leaving out the do
and the end
in the example body, like so
it "has a title"
will mark a test as pending. For bigger applications, where you want to tackle one test at a time, you can also add an x
in front of an example, making it read
describe Idea do
xit "has a title" do
end
or use the word pending
in your example.
Behavior-Driven Development
Normally we would go about BDD testing in a slightly different way. Thinking about the application we want to build, we’ll write down our expectations and then start building step by step, with the specifications in mind.
We’d first write
describe Idea do
it "has a title"
idea = Idea.new
idea.title.should be_true
# or, alternatively: idea.title.should == true
end
end
and only then create a file named idea.rb
introducing the idea class
class Idea
attr_accessor :title
end
as running rspec spec/lib/idea_spec.rb
in your terminal before you’ve implemented that class will throw you an error. Luckely, errors are nothing to be afraid of. RSpec errors actually help you write (the necessary) code!
Try and write tests for the follow up guides to check if you’re implementing ALL the right things.
describe Attendee do
it "tests everything"
end
Just saying.
Happy testing!