webentwicklung-frage-antwort-db.com.de

Richten Sie RSpec ein, um einen Edelstein zu testen (nicht Rails)

Mit dem hinzugefügten Generator von rspec-Rails ist es ziemlich einfach, RSpec für das Testen einer Rails) -Anwendung einzurichten Ich habe gerade Bundler (bundle gem my_gem), um die Struktur für den neuen Edelstein einzurichten und die * .gemspec manuell zu bearbeiten. Ich habe auch s.add_development_dependency "rspec", ">= 2.0.0" zu gemspec und habe ein bundle install.

Gibt es ein nettes Tutorial, was als nächstes zu tun ist, um RSpec zum Laufen zu bringen?

152
Zardoz

Ich habe diese Antwort aktualisiert, um sie den aktuellen Best Practices anzupassen:

Bundler unterstützt die Juwelenentwicklung perfekt. Wenn Sie einen Edelstein erstellen, ist das nur, was Sie in Ihrem Gemfile haben müssen, das Folgende:

source "https://rubygems.org"
gemspec

Dies weist Bundler an, beim Ausführen von bundle install In Ihrer Gemspec-Datei nach den Abhängigkeiten zu suchen.

Stellen Sie als Nächstes sicher, dass RSpec eine Entwicklungsabhängigkeit Ihres Edelsteins ist. Bearbeiten Sie die Gemspec so, dass sie lautet:

spec.add_development_dependency "rspec"

Erstellen Sie als Nächstes spec/spec_helper.rb Und fügen Sie Folgendes hinzu:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

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

Die ersten beiden Zeilen weisen Bundler an, nur die Edelsteine ​​in Ihre Edelsteinspezifikation zu laden. Wenn Sie Ihr eigenes Juwel auf Ihrem eigenen Computer installieren, werden Ihre Spezifikationen dazu gezwungen, Ihren aktuellen Code zu verwenden, nicht die Version, die Sie separat installiert haben.

Erstellen Sie eine Spezifikation, zum Beispiel spec/foobar_spec.rb:

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

Optional: Fügen Sie eine .rspec - Datei für die Standardoptionen hinzu und fügen Sie sie in den Stammpfad Ihres Edelsteins ein:

--color
--format documentation

Zum Schluss: Führen Sie die folgenden Spezifikationen aus:

$ rspec spec/foobar_spec.rb
248
iain

Die obige Lösung von Iain funktioniert großartig!

Wenn du auch ein Rakefile haben willst, ist das alles was du brauchst:

require 'rspec/core/rake_task'

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

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

Überprüfen Sie das RDoc für RakeTask auf verschiedene Optionen, die Sie optional an die Aufgabendefinition übergeben können.

53
Mirko Froehlich

Sie können Ihren neuen Edelstein mit rspec erzeugen, indem Sie bundler gem --test=rspec my_gem Ausführen. Kein zusätzliches Setup!

Ich vergesse das immer. Es ist hier implementiert: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36

25
StevenNunez

Hier ist eine billige und einfache (wenn auch nicht offiziell empfohlene) Möglichkeit:

Machen Sie ein Verzeichnis in der Wurzel Ihres Edelsteins mit dem Namen spec, und geben Sie dort Ihre Spezifikationen ein. Sie haben wahrscheinlich schon rspec installiert, aber wenn nicht, machen Sie einfach ein gem install rspec und vergiss Gemfiles und Bundler.

Als Nächstes erstellen Sie eine Spezifikation und müssen ihr mitteilen, wo sich Ihre App befindet, wo sich Ihre Dateien befinden und welche Datei Sie testen möchten (zusammen mit eventuellen Abhängigkeiten):

# 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

Öffne das Terminal und starte rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Wenn Sie etwas wollen .rspec Optionen Liebe, mach ein .rspec Datei und lege sie in den Wurzelpfad deines Edelsteins. Meins sieht so aus:

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

Einfach, schnell, ordentlich!

Ich mag das, weil Sie Ihrem Projekt überhaupt keine Abhängigkeiten hinzufügen müssen und das Ganze sehr schnell bleibt. bundle exec verlangsamt die Arbeit ein wenig, was Sie tun müssen, um sicherzustellen, dass Sie immer dieselbe Version von rspec verwenden. Diese 0,56 Sekunden, die für die Ausführung von zwei Tests benötigt wurden, waren zu 99% belegt, als mein Computer zum Laden von rspec benötigt wurde. Das Ausführen von Hunderten von Spezifikationen sollte extrem schnell sein. Das einzige Problem, auf das Sie stoßen könnten, ist, dass Sie möglicherweise einige Tests neu schreiben müssen, wenn Sie die Versionen von rspec ändern und die neue Version nicht mit einer Funktion abwärtskompatibel ist, die Sie in Ihrem Test verwendet haben.

Dies ist nützlich, wenn Sie einmalige Spezifikationen erstellen oder einen guten Grund haben, rspec NICHT in Ihre gemspec aufzunehmen. Es ist jedoch nicht sehr gut, um das Teilen oder Erzwingen von Kompatibilität zu ermöglichen.

6
wulftone