Writing a Simple RSpec Test
Tags: beginners, tutorial, ruby, testing
Published: 2020-02-14 20:37:55

RSpec is a popular testing framework for Ruby. Here we will write some simple tests for ourselves to help learn the basics.

The first step is to install our gem using 
```$ gem install rspec```

Then, inside of our project directory, we call ```$ rspec --init```
This initializes two files: the **spec_helper** and the **.rspec file**. We will also need to create a spec file in which to build our tests. Today this will be named **spec/cat_spec.rb**. We are building instances of the class Cat inside of a file we have named **lib/cat.rb**.


Inside of **spec/cat_spec.rb**, we need to ```require "spec_helper"``` which will load the configuration for the specification. We will also ```require "cat"``` as this is the class for which we will be writing examples. We can define this class inside of our **lib/cat.rb** file.
```ruby
class Cat
end
```
We are then ready to describe how we want our cats to behave. We start by writing a "describe" block in **spec/cat_spec.rb**. Inside of this block we will write our examples to test.
```ruby 
require "spec_helper"
require "cat"


describe Cat do
    #examples to test    
end
```
Here our description will test for the **name** of our cat instance.
```ruby 
describe Cat do
    it "is named Daz" do
        cat = Cat.new
        expect(cat.name).to eq("Daz")
    end
end
```
We can run our test by calling `$ rspec`.
Doing so now gives us a failing test.
```ruby 

  1) Cat is named Daz
     Failure/Error: expect(cat.name).to eq("Daz")
     
     NoMethodError:
       undefined method `name' for #<Cat:0x00007f948d0e7030>
     # ./spec/cat_spec.rb:8:in `block (2 levels) in <top (required)>'

Finished in 0.0041 seconds (files took 0.12837 seconds to load)
1 example, 1 failure
``` 
We can then write code in our **lib/cat.rb** file to correct the ```undefined method `name'``` and get our test to pass.
```ruby 
class Cat
    attr_accessor :name
    def initialize
        @name = "Daz"
    end
end
```
Running `$ rspec` again should give us a green light on our test.

Now that we have one test passing, let's write another description to test in **spec/cat_spec.rb**.
```ruby
describe Cat do
    it "is named Daz" do
        cat = Cat.new
        expect(cat.name).to eq("Daz")
    end
    it "is the color orange" do
        cat = Cat.new
        expect(cat.color).to eq("orange")
    end
end
```
Running `$ rspec` now should show that we have 2 examples and are failing 1 of them.
```ruby
1) Cat is the color orange
     Failure/Error: expect(cat.color).to eq("orange")
     
     NoMethodError:
       undefined method `color' for #<Cat:0x00007ff2fa9a3248 @name="Daz">
     # ./spec/cat_spec.rb:12:in `block (2 levels) in <top (required)>'

Finished in 0.00502 seconds (files took 0.1164 seconds to load)
2 examples, 1 failure
```
If we take direction from the test and add code that defines our cat **color** as **orange**, we should be able to get a second passing test.
```ruby 
class Cat
    attr_accessor :name, :color
    def initialize
        @name = "Daz"
        @color = "orange"
    end
end
```
```ruby 
Finished in 0.00474 seconds (files took 0.12366 seconds to load)
2 examples, 0 failures
```
And that's it. We can continue to practice with as many tests as we would like.