Setup RSpec to test a gem (not Rails)

后端 未结 4 846
野趣味
野趣味 2020-12-07 06:52

It is pretty easy with the added generator of rspec-rails to setup RSpec for testing a Rails application. But how about adding RSpec for testing a gem in development? I am n

相关标签:
4条回答
  • 2020-12-07 07:15

    You can generate your new gem with rspec by running bundler gem --test=rspec my_gem. No additional Setup!

    I always forget this. It's implemented here: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36

    0 讨论(0)
  • 2020-12-07 07:16

    Here's a cheap and easy (though not officially recommended) way:

    Make a dir in your gem's root called spec, put your specs in there. You probably already have rspec installed, but if you don't, just do a gem install rspec and forget Gemfiles and bundler.

    Next, you'll make a spec, and you need to tell it where your app is, where your files are, and include the file you want to test (along with any dependencies it has):

    # spec/awesome_gem/awesome.rb
    APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
    $: << File.join(APP_ROOT, 'lib/awesome_gem') # so rspec knows where your file could be
    require 'some_file_in_the_above_dir' # this loads the class you want to test
    
    describe AwesomeGem::Awesome do
      before do
        @dog = AwesomeGem::Awesome.new(name: 'woofer!')
      end
      it 'should have a name' do
        @dog.name.should eq 'woofer!'
      end
      context '#lick_things' do
        it 'should return the dog\'s name in a string' do
          @dog.lick_things.should include 'woofer!:'
        end
      end
    end
    

    Open up Terminal and run rspec:

    ~/awesome_gem $ rspec
    ..
    
    Finished in 0.56 seconds
    2 examples, 0 failures
    

    If you want some .rspec options love, go make a .rspec file and put it in your gem's root path. Mine looks like this:

    # .rspec
    --format documentation --color --debug --fail-fast
    

    Easy, fast, neat!

    I like this because you don't have to add any dependencies to your project at all, and the whole thing remains very fast. bundle exec slows things down a little, which is what you'd have to do to make sure you're using the same version of rspec all the time. That 0.56 seconds it took to run two tests was 99% taken up by the time it took my computer to load up rspec. Running hundreds of specs should be extremely fast. The only issue you could run into that I'm aware of is if you change versions of rspec and the new version isn't backwards compatible with some function you used in your test, you might have to re-write some tests.

    This is nice if you are doing one-off specs or have some good reason to NOT include rspec in your gemspec, however it's not very good for enabling sharing or enforcing compatibility.

    0 讨论(0)
  • 2020-12-07 07:34

    Iain's solution above works great!

    If you also want a Rakefile, this is all you need:

    require 'rspec/core/rake_task'
    
    RSpec::Core::RakeTask.new(:spec)
    
    # If you want to make this the default task
    task default: :spec
    

    Check the RDoc for RakeTask for various options that you can optionally pass into the task definition.

    0 讨论(0)
  • 2020-12-07 07:35

    I've updated this answer to match current best practices:

    Bundler supports gem development perfectly. If you are creating a gem, the only thing you need to have in your Gemfile is the following:

    source "https://rubygems.org"
    gemspec
    

    This tells Bundler to look inside your gemspec file for the dependencies when you run bundle install.

    Next up, make sure that RSpec is a development dependency of your gem. Edit the gemspec so it reads:

    spec.add_development_dependency "rspec"
    

    Next, create spec/spec_helper.rb and add something like:

    require 'bundler/setup'
    Bundler.setup
    
    require 'your_gem_name' # and any other gems you need
    
    RSpec.configure do |config|
      # some (optional) config here
    end
    

    The first two lines tell Bundler to load only the gems inside your gemspec. When you install your own gem on your own machine, this will force your specs to use your current code, not the version you have installed separately.

    Create a spec, for example spec/foobar_spec.rb:

    require 'spec_helper'
    describe Foobar do
      pending "write it"
    end
    

    Optional: add a .rspec file for default options and put it in your gem's root path:

    --color
    --format documentation
    

    Finally: run the specs:

    $ rspec spec/foobar_spec.rb
    
    0 讨论(0)
提交回复
热议问题