RSpec Describe Method

RSpec shorthand for describing individual methods  

https://github.com/brett-richardson/rspec-describe-method

RSpec Describe Method is a ruby gem that provides a shorthand for testing specific methods of classes.

It supports both instance methods and class methods, with or without arguments.

Using Rspec DescribeMethod

Using RSpec DescribeMethod is super simple.

In your Gemfile:

group :development, :testing do
  gem 'rspec-describe-method'
end

In your spec_helper.rb:

require 'rspec/describe-method'

And your specs can look like this:

describe String do
  describe_method '.new' do
    it { should be_a String }
  end

  describe_method('#concat', 'argument') do
    it { should match /argument/i }
  end

  context 'with an instance' do
    subject { String.new 'test' }

    describe_method('#upcase') do
      it { should eq 'TEST' }
    end
  end
end

So what’s happening behind the scenes?

Essentially we do a little bit of meta-programming and replace the describe_method with a normal describe and subject call as so:

describe User do
  #--- This... ---------------

  describe_method '#to_s' do
    it { should be_a String }
  end

  #--- Is Equivalent to... ---

  describe '#to_s' do
    subject { described_class.new.to_s }

    it { should be_a String }
  end
end
describe User do
  subject( :instance ){ described_class.new }

  #--- This... ----------------

  describe_method '.find', 1 do
    it { should be_a User }
  end

  #--- Is Equivalent to... ----

  describe '.find( 1 )' do
    subject { instance.class.find 1 }

    it { should be_a String )
  end
end

Describe a method call on the current test subject in your specs with ‘describe_method’, and a # for instance methods and a . for class methods.

Instances will automatically delagate to their class, and classes will automatically create an instance of themselves.

Alias method: when_calling

The alias method when_calling is provided which makes specs more human-readable, especially when calls are nested within eachother:

describe String do
  subject { String.new 'test' }

  when_calling '#upcase' do
    it { should eq 'TEST' }

    when_calling('#+', 'ING') do
      it { should eq 'TESTING' }
    do
  end
end

NOTE

When the subject is a Class, and you call an instance method describe_method "#something" the class will call .new on itself with NO ARGUMENTS, you may not want this behavior.

comments powered by Disqus