2016-07-12 11 views
0

Ich bin nur ein paar Tage in rspec lernen, und ich versuche, meinen ersten Test in einem Programm zu schreiben, das Klassen enthält. Ich weiß, dass dieser Test falsch ist, aber ich weiß nicht, wie ich ihn beheben kann, weil ich keinen Fehler bekomme. Stattdessen fängt es einfach an, durch mein Programm zu laufen (ein einfaches Tic Tac Toe Spiel). Ich habe den Code für das Tic Tac Toe Spiel aus Gründen der Kürze weggelassen. Jede Anleitung würde sehr geschätzt werden. Vielen Dank!rspec Test läuft nur ganzes Programm

require "tictactoe" 

describe Game do 
    describe "#players" do 
    it "displays player names" do 
     player1 = "Harry" 
     expect(Game.new("Harry", "Nick").players).to eq(player1) 
    end 
    end 
end 
+0

Wenn Sie z.B. 'ruby tictactoe.rb' führt es dein gesamtes Programm aus? Wenn dies der Fall ist, wird "tictactoe" mit "require" auch Ihr gesamtes Programm ausführen. –

+0

ja läuft ruby ​​tictactoe.rb wird mein Programm laufen. Ich hatte dies getan, weil ich für alle anderen Übungsspezifikationen, die ich schrieb, auch die Datei mit meinem Ruby-Code versehen hatte. Sollte ich das nicht tun? –

Antwort

2

Wie wir in den Kommentaren oben entdeckt, ist das Problem, dass tictactoe.rb den Code hat, die Ihre gesamte läuft Programm, so require "tictactoe" läuft auch Ihr gesamtes Programm.

Es gibt zwei Lösungen.

Die erste besteht darin, tictactoe.rb zu ändern, um nur den Code auszuführen, der bewirkt, dass das gesamte Programm ausgeführt wird, wenn Ihr Skript von der Befehlszeile ausgeführt wird und nicht wenn es d von einem anderen Skript ist. Dies ist ein gemeinsames Idiom in Ruby:

# declare your classes up here 
class Game 
    # ... 
end 

# etc... 

# down here run the program only if this 
# script is run from the command line 
if __FILE__ == $0 
    game = Game.new 
    # ...and so on... 
end 

Jetzt können Sie require "tictactoe" in Ihren Tests, wohl wissend, dass der Code in dem if Block wird nicht ausgeführt.

Die zweite Lösung besteht darin, Ihre Klassendeklarationen in andere Dateien zu verschieben, z. Setzen Sie die Spielklasse in game.rb und haben Sie tictactoe.rb do require "game", und haben Sie den RSpec-Code, der die Game-Klasse testet das gleiche tun.

Der letztere Ansatz ist wartungsfreundlicher, da Programme größer werden. Wenn Sie sich ein großes Juwel, sagen wir Bundler, ansehen, werden Sie feststellen, dass die "Programm" -Datei, bundle, nur ein paar Zeilen Code enthält - alles, was sie tut, ist require anderer Code, der die eigentliche Arbeit leistet.

Wenn jedoch Ihr Programm klein ist und Sie nicht erwarten, dass es kurzfristig stark wächst, ist der frühere Ansatz auch in Ordnung.

+0

Ich habe nicht genug Punkte, um deine Antwort zu verbessern, aber es hat mir enorm geholfen, auf dem richtigen Weg zu sein. Danke, dass du mir diesen Trick gezeigt hast! –

0

Versuchen Sie dies. Zuerst, require rspec an der Spitze Ihrer Datei.

require "tictactoe" 
require "rspec" 

RSpec.describe Game do 
    describe "#players" do 
    it "displays player names" do 
     player1 = "Harry" 
     expect(Game.new("Harry", "Nick").players).to eq(player1) 
    end 
    end 
end 

Dann stellen Sie sicher, führen Sie Ihre Datei mit rspec NICHT ruby

so

rspec foo.rb 
+0

Dies hat nicht funktioniert. Ich habe das Gefühl, dass es etwas mit dem Aufruf von Game.new in der expect-Anweisung zu tun hat, aber ich weiß nicht, wie ich das machen soll, weil die Spielernamen als Instanzvariable initialisiert werden, wenn Game.new aufgerufen wird. Von dort möchte ich die #players-Methode aufrufen können, um sicherzustellen, dass die Namen der Spieler auf dem Bildschirm angezeigt werden. –

+0

Was ist der Fehler, den Sie bekommen? – nikkypx