Настройте RSpec для тестирования гема (не Rails) - PullRequest
151 голосов
/ 09 декабря 2010

С добавленным генератором rspec-rails довольно просто настроить RSpec для тестирования приложения Rails. Но как насчет добавления RSpec для тестирования гемов в разработке? Я не использую ювелирный или подобные инструменты. Я просто использовал Bundler (bundle gem my_gem), чтобы настроить структуру для нового драгоценного камня и отредактировать * .gemspec вручную. Я также добавил s.add_development_dependency "rspec", ">= 2.0.0" в gemspec и сделал bundle install.

Есть ли хороший урок, что делать дальше, чтобы заставить работать RSpec?

Ответы [ 4 ]

247 голосов
/ 09 декабря 2010

Я обновил этот ответ, чтобы соответствовать текущим рекомендациям:

Bundler отлично поддерживает разработку гемов. Если вы создаете драгоценный камень, то only вещь, которую вы должны иметь в своем Gemfile, будет выглядеть следующим образом:

source "https://rubygems.org"
gemspec

Это говорит Bundler, что нужно искать в вашем файле gemspec зависимости, когда вы запускаете bundle install.

Далее, убедитесь, что RSpec является зависимостью разработки вашего гема. Отредактируйте gemspec так, чтобы он гласил:

spec.add_development_dependency "rspec"

Далее создайте spec/spec_helper.rb и добавьте что-то вроде:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

RSpec.configure do |config|
  # some (optional) config here
end

Первые две строки говорят Bundler загружать только драгоценные камни внутри вашей gemspec. Когда вы устанавливаете свой собственный гем на свой компьютер, это заставит ваши спецификации использовать ваш текущий код, а не версию, которую вы установили отдельно.

Создайте спецификацию, например spec/foobar_spec.rb:

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

Необязательно: добавьте файл .rspec для параметров по умолчанию и поместите его в корневой каталог вашего драгоценного камня:

--color
--format documentation

Наконец: запустите спецификации:

$ rspec spec/foobar_spec.rb
53 голосов
/ 08 января 2011

Решение Iain, описанное выше, прекрасно работает!

Если вам также нужен Rakefile, это все, что вам нужно:

require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)

# If you want to make this the default task
task default: :spec

Проверьте RDoc для RakeTask для различныхопции, которые вы можете опционально передать в определение задачи.

25 голосов
/ 20 июля 2014

Вы можете создать свой новый драгоценный камень с помощью rspec, запустив bundler gem --test=rspec my_gem.Никаких дополнительных настроек!

Я всегда об этом забываю.Это реализовано здесь: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36

6 голосов
/ 18 марта 2012

Вот дешевый и простой (хотя официально не рекомендованный) способ:

Сделайте dir в корне вашего драгоценного камня под названием spec, поместите туда свои спецификации. Возможно, вы уже установили rspec, но если вы этого не сделаете, просто сделайте gem install rspec и забудьте о Gemfiles и bundler.

Далее вы создадите спецификацию, и вам нужно будет указать, где находится ваше приложение, где находятся ваши файлы, и включить файл, который вы хотите протестировать (вместе со всеми имеющимися у него зависимостями):

# 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

Откройте Терминал и запустите rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Если вам нужна любовь по .rspec, создайте файл .rspec и поместите его в корневой каталог вашего драгоценного камня. Моя выглядит так:

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

Легко, быстро, аккуратно!

Мне это нравится, потому что вам вообще не нужно добавлять никаких зависимостей в ваш проект, и все это остается очень быстрым. bundle exec немного замедляет работу, что вам и нужно сделать, чтобы убедиться, что вы используете одну и ту же версию rspec все время. Те 0,56 секунды, которые потребовались для запуска двух тестов, заняли 99% к тому времени, которое потребовалось моему компьютеру для загрузки rspec. Запуск сотен спецификаций должен быть чрезвычайно быстрым. Единственная проблема, с которой вы можете столкнуться - это то, что, если вы меняете версии rspec, и новая версия не обратно совместима с какой-то функцией, которую вы использовали в своем тесте, вам, возможно, придется переписать некоторые тесты. *

Это хорошо, если вы выполняете одноразовые спецификации или у вас есть веская причина НЕ включать rspec в ваш gemspec, однако это не очень хорошо для обеспечения совместного использования или обеспечения совместимости.

...