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ł?
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
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.
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!
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.
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