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.
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. –
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? –