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


154

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

Чи є якийсь хороший підручник, що робити далі, щоб RSpec працював?


Я думаю, що я повинен написати один :-) ... Принаймні, є два дорогоцінні камені, які вже чудово інтегрують його: act-as-taggable-on і act_as_geocodable.
Зардоз

Відповіді:


255

Я оновив цю відповідь, щоб відповідати поточним найкращим практикам:

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файл до параметрів за замовчуванням і покладіть його в кореневий шлях вашого дорогоцінного каміння:

--color
--format documentation

Нарешті: запустіть характеристики:

$ rspec spec/foobar_spec.rb

75
Для справедливості, замість цього слід запускати команду init RSpec для створення файлів скелетів специфікацій, а не вводити їх вручну. Це забезпечило б сумісність із версією RSpec, яку ви використовуєте: rspec --init
Attila Györffy

12
rspec --initНе було доступно, коли я писав це, але добре!
iain

Насправді я знайшов найкращий спосіб виконати вимоги у специфічному помічнику: це: вимагати "rubygems" вимагати "bundler / setup" Bundler.require (: за замовчуванням
,:

Як саме три рядки коду @ mkon працюють по-різному від трьох рядків коду iain?
Накілон

1
Рядки від @mkon вимагатимуть усіх дорогоцінних каменів у групах для розробки та тестування, тоді як мій підхід вимагає вручну кожен дорогоцінний камінь. Оскільки при створенні дорогоцінних каменів потрібно вимагати кожного самоцвіту, я думаю, що це кращий / чіткіший підхід, навіть якщо це може бути трохи більше роботи.
iain

53

Рішення Іена вище працює чудово!

Якщо ви також хочете 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 на різні параметри, які ви необов'язково можете передати у визначення завдання.


26

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

Я завжди це забуваю. Тут реалізовано: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


1
Акуратно! Однак я думаю, що ваше ім'я дорогоцінного каменя повинно бути вказане підкресленнями замість корпусу верблюда. Інакше Bundler створює файли з великої літери (Bundler 1.7.4)
Malte

Бундлер поскаржився --test=rspec, але все одно запитав, чи хочу я використовувати Rspec, коли бігав bundler gem my_gem.
Ніколя Маттіа

7

Ось дешевий і простий (хоча офіційно не рекомендований) спосіб:

Зробіть реж у корені дорогоцінного каменю, який називається spec, покладіть там свої характеристики. Напевно ви вже встановили rspec, але якщо цього не зробите, просто зробіть gem install rspecі забудьте Gemfiles та постачальник.

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

# 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, однак це не дуже добре для включення спільного використання або забезпечення сумісності.


Чи є спосіб не ставити AwesomeGem :: перед іменами класів у будь-який момент, коли ви посилаєтесь на тестуючий об’єкт? Або коли ви створюєте новий тест, як у вашому прикладі.
Міша Слюсарев

1
Звичайно, ви можете або встановити назву свого класу, що дорівнює чомусь коротшому, наприклад, Thing = AwesomeGem::Awesomeабо ви можете зробити тест всередині модуля, наприкладmodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
wulftone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.