Настройка RSpec для проверки драгоценного камня (не Rails)

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

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

Ответ 1

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

Bundler отлично поддерживает разработку драгоценных камней. Если вы создаете драгоценный камень, только вещь, которую вы должны иметь в своем 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 для параметров по умолчанию и поместите его в корневой путь gem:

--color
--format documentation

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

$ rspec spec/foobar_spec.rb

Ответ 2

Решение 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 для различных опций, которые вы можете передать в определение задачи.

Ответ 4

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

Создайте каталог в своем корневом камне под названием 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\ 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, однако это не очень хорошо для обеспечения совместного использования или обеспечения совместимости.