Ustaw RSpec, aby przetestować gem (nie Rails)

Z dodanym generatorem RSpec-rails jest całkiem łatwo skonfigurować RSpec do testowania aplikacji Rails. Ale co powiesz na dodanie RSpec do testowania klejnotu w rozwoju? Nie używam jubilera ani takich narzędzi. Po prostu użyłem Bundler (bundle gem my_gem), aby ustawić strukturę dla nowego klejnotu i edytować *.gemspec Dodałem również s.add_development_dependency "rspec", ">= 2.0.0" do gemspec i zrobiłem bundle install.

Czy Jest jakiś fajny tutorial co dalej zrobić aby RSpec działał?

Author: Zardoz, 2010-12-09

4 answers

Zaktualizowałem tę odpowiedź, aby dopasować aktualne najlepsze praktyki:

Bundler doskonale wspiera rozwój klejnotów. Jeśli tworzysz gem, to tylko rzecz, którą musisz mieć w swoim pliku Gemfile jest następująca:

source "https://rubygems.org"
gemspec

Mówi To Bundlerowi, aby zajrzał do Twojego pliku gemspec pod kątem zależności po uruchomieniu bundle install.

Następnie upewnij się, że RSpec jest zależnością deweloperską twojego klejnotu. Edytuj gemspec tak, aby brzmiał:

spec.add_development_dependency "rspec"

Następnie utwórz spec/spec_helper.rb i dodaj coś w stylu:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

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

Pierwsze dwie linie mówią Bundlerowi, aby załadował tylko klejnoty w Twoim gemspec. Po zainstalowaniu własnego klejnotu na własnym komputerze, wymusi to użycie przez specyfikacje bieżącego kodu, a NIE wersji zainstalowanej osobno.

Utwórz spec, na przykład spec/foobar_spec.rb:

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

Opcjonalne: Dodaj plik .rspec dla opcji domyślnych i umieść go w ścieżce głównej klejnotu:

--color
--format documentation

Wreszcie: Uruchom specyfikację:

$ rspec spec/foobar_spec.rb
 242
Author: iain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 19:13:19

Powyższe rozwiązanie działa świetnie!

Jeśli chcesz również Rakefile, to jest wszystko, czego potrzebujesz:

require 'rspec/core/rake_task'

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

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

Sprawdź RDOC dla RakeTask dla różnych opcji, które można opcjonalnie przekazać do definicji zadania.

 50
Author: Mirko Froehlich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 22:44:14

Możesz wygenerować nowy gem za pomocą rspec, uruchamiając bundler gem --test=rspec my_gem. Brak dodatkowej konfiguracji!

Zawsze o tym zapominam. Jest on realizowany tutaj: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36
 24
Author: StevenNunez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-25 13:16:36

Oto tani i łatwy (choć oficjalnie nie zalecany) sposób:

Zrób dir w korzeniu klejnotu o nazwie spec, włóż tam swoje specyfikacje. Prawdopodobnie masz już zainstalowany rspec, ale jeśli tego nie zrobisz, po prostu zrób gem install rspec i zapomnij o Gemfiles i bundlerze.

Następnie stworzysz specyfikację i musisz powiedzieć jej, gdzie jest Twoja aplikacja, gdzie są Twoje pliki i dołączyć plik, który chcesz przetestować (wraz z wszelkimi zależnościami, które ma):

# 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

Otwórz Terminal i uruchom rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Jeśli chcesz jakieś opcje .rspec love, idź zrobić plik .rspec i umieścić go w ścieżce głównej klejnotu. Mój wygląda tak:

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

Łatwo, szybko, schludnie!

Podoba mi się to, ponieważ nie musisz w ogóle dodawać żadnych zależności do swojego projektu, a całość pozostaje bardzo szybka. bundle exec trochę spowalnia, co musisz zrobić, aby upewnić się, że używasz tej samej wersji rspec cały czas. To 0.56 sekundy zajęło przeprowadzenie dwóch testów było 99% Zajęło mi to trochę czasu, zanim mój komputer się załadował. Uruchamianie setek specyfikacji powinno być niezwykle szybkie. Jedynym problemem, który możesz napotkać, że jestem świadomy jest to, że jeśli zmienisz wersje rspec i nowa wersja nie jest wstecznie kompatybilna z jakąś funkcją używaną w teście, być może będziesz musiał ponownie napisać kilka testów.

Jest to miłe, jeśli robisz jednorazowe specyfikacje lub masz dobry powód, aby nie włączyć rspec w swoim gemspec, jednak nie jest to zbyt dobre dla umożliwienia udostępniania lub egzekwowanie zgodności.

 6
Author: wulftone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 21:12:03