RSpec – Writing Specs

  • Post author:
  • Post category:RSpec
  • Post comments:1 Comment

In this chapter, we will create a new Ruby class, save it in its own file and create a separate spec file to test this class.

First, in our new class, it is called StringAnalyzer. It’s a simple class that, you guessed it, analyzes strings. Our class has only one method has_vowels? which as its names suggests, returns true if a string contains vowels and false if it doesn’t. Here’s the implementation for StringAnalyzer −

class StringAnalyzer 
   def has_vowels?(str) 
      !!(str =~ /[aeio]+/i) 
   end 
end

If you followed the HelloWorld section, you created a folder called C:\rspec_tutorial\spec.

Delete the hello_world.rb file if you have it and save the StringAnalyzer code above to a file called string_analyzer.rb in the C:\rspec_tutorial\spec folder.

Here is the source for our spec file to test StringAnalyzer −

require 'string_analyzer' 

describe StringAnalyzer do 
   context "With valid input" do 
      
      it "should detect when a string contains vowels" do 
         sa = StringAnalyzer.new 
         test_string = 'uuu' 
         expect(sa.has_vowels? test_string).to be true 
      end 
		
      it "should detect when a string doesn't contain vowels" do 
         sa = StringAnalyzer.new 
         test_string = 'bcdfg' 
         expect(sa.has_vowels? test_string).to be false
      end 
      
   end 
end

Save this in the same spec directory, giving it the name string_analyzer_test.rb.

In your cmd.exe window, cd to the C:\rspec_tutorial folder and run this command: dir spec

You should see the following −

Directory of C:\rspec_tutorial\spec

09/13/2015 08:22 AM  <DIR>    .
09/13/2015 08:22 AM  <DIR>    ..
09/12/2015 11:44 PM                 81 string_analyzer.rb
09/12/2015 11:46 PM              451 string_analyzer_test.rb

Now we’re going to run our tests, run this command: rspec spec

When you pass the name of a folder to rspec, it runs all of the spec files inside of the folder. You should see this result −

No examples found.

Finished in 0 seconds (files took 0.068 seconds to load)
0 examples, 0 failures

The reason that this happened is that, by default, rspec only runs files whose names end in “_spec.rb”. Rename string_analyzer_test.rb to string_analyzer_spec.rb. You can do that easily by running this command −

ren spec\string_analyzer_test.rb string_analyzer_spec.rb

Now, run rspec spec again, you should see output that looks like this −

F.
Failures:

   1) StringAnalyzer With valid input should detect when a string contains vowels
      Failure/Error: expect(sa.has_vowels? test_string).to be true 
         expected true
            got false
      # ./spec/string_analyzer_spec.rb:9:in `block (3 levels) in <top (required)>'

Finished in 0.015 seconds (files took 0.12201 seconds to load)
2 examples, 1 failure

Failed examples:
rspec ./spec/string_analyzer_spec.rb:6 # StringAnalyzer With valid 
   input should detect when a string contains vowels
Do you see what just happened? Our spec failed because we have a bug in 
   StringAnalyzer. The bug is simple to fix, open up string_analyzer.rb
   in a text editor and change this line:
!!(str =~ /[aeio]+/i)
to this:
!!(str =~ /[aeiou]+/i)

Now, save the changes you just made in string_analyizer.rb and run the rspec spec command again, you should now see output that looks like −

..
Finished in 0.002 seconds (files took 0.11401 seconds to load)
2 examples, 0 failures

Congratulations, the examples (tests) in your spec file are now passing. We fixed a bug in the regular expression which has vowels method but our tests are far from complete.

It would make sense to add more examples that tests various types of input strings with the has vowels method.

The following table shows some of the permutations that could be added in new Examples (it blocks)

Input stringDescriptionExpected result with has_vowels?
‘aaa’, ‘eee’, ‘iii’, ‘o’Only one vowel and no other letters.true
‘abcefg’‘At least one vowel and some consonants’true
‘mnklp’Only consonants.false
‘’Empty string (no letters)false
‘abcde55345&??’Vowels, consonants, numbers and punctuation characters.true
‘423432%%%^&’Numbers and punctuation characters only.false
‘AEIOU’Upper case vowels only.true
‘AeiOuuuA’Upper case and lower vowels only.true
‘AbCdEfghI’Upper and lower case vowels and consonants.true
‘BCDFG’Upper case consonants only.false
‘ ‘Whitespace characters only.false

It is up to you to decide, which examples to add to your spec file. There are many conditions to test for, you need to determine what subset of conditions is most important and tests your code the best.

The rspec command offers many different options, to see them all, type rspec -help. The following table lists the most popular options and describes what they do.

Sr.No.Option/flag & Description
1-I PATHAdds PATH to the load (require) path that rspec uses when looking for Ruby source files.
2-r, –require PATHAdds a specific source file to be required in your spec. file(s).
3–fail-fastWith this option, rspec will stop running specs after the first Example fails. By default, rspec runs all specified spec files, no matter how many failures there are.
4-f, –format FORMATTERThis option allows you to specify different output formats. See the section on Formatters for more details about output formats.
5-o, –out FILEThis option directs rspec to write the test results to the output file FILE instead of to standard out.
6-c, –colorEnables color in rspec’s output. Successful Example results will display in green text, failures will print in red text.
7-b, –backtraceDisplays full error backtraces in rspec’s output.
8-w, –warningsDisplays Ruby warnings in rspec’s output.
9-P, –pattern PATTERNLoad and run spec files that match the pattern PATTERN. For example, if you pass -p “*.rb”, rspec will run all Ruby files, not just the ones that end in “_spec.rb”.
10-e, –example STRINGThis option directs rspec to run all Examples that contain the text STRING in their descriptions.
11-t, –tag TAGWith this option, rspec will only run examples that contain the tag TAG. Note that TAG is specified as a Ruby symbol. See the section on RSpec Tags for more details.

This Post Has One Comment

  1. super slot

    Say, you got a nice blog post.Really thank you! Cool.

Leave a Reply