2016-07-12 5 views
0

rspecの学習に数日しかかからず、クラスを含むプログラムで最初のテストを作成しようとしています。私はこのテストが間違っていることを知っていますが、私は失敗しないので、それを修正する方法はわかりません。代わりに、ちょうど私のプログラム(単純なチックタックつま先ゲーム)を実行し始めます。私は簡潔にするためにtic tac toeゲームのコードを省いた。どんな指針も大変ありがとうございます。ありがとう!rspecテストはプログラム全体を実行します

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

'ruby tictactoe.rb'はプログラム全体を実行しますか?そうであれば、 'require" tictactoe "'もあなたのプログラム全体を実行します。 –

+0

はいruby tictactoe.rbを実行するとプログラムが実行されます。私が書いた他のすべての練習仕様については、ファイルにもルビコードを含めていたので、私はこれを行っていました。私はこれをしてはいけませんか? –

答えて

2

を使用してファイルを実行することを確認し、問題がtictactoe.rbはあなたの全体を実行するコードを持っているということですプログラムので、require "tictactoe"もあなたのプログラム全体を実行します。

2つの解決策があります。

最初にtictactoe.rbを変更すると、スクリプトがコマンドラインから実行されたときにプログラム全体が実行されるコードだけが実行され、別のスクリプトのrequireが実行されたときは実行されません。これは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 

今、あなたはifブロック内のコードが実行されないことを知って、あなたのテストでrequire "tictactoe"ことができます。

第2の解決策は、クラス宣言を他のファイルに移動することです。 Gameクラスをgame.rbに置き、tictactoe.rbにはrequire "game"を実行し、GameクラスをテストするRSpecコードには同じことを行います。

後者のアプローチは、プログラムが大きくなるにつれて、より保守的です。たとえば、Bundlerのような大きな宝石を見ると、「プログラム」ファイルbundleには数行のコードしかないことがわかります。実際にはrequireというコードがあります。

しかし、あなたのプログラムが小さく、短期間に大きく成長することを期待していない場合は、前者のアプローチもうまくいきます。

+0

私はあなたの応答をアップアップするのに十分なポイントがありませんが、それは正しい軌道に乗るために非常に助けになりました。そのトリックを私に見せてくれてありがとう! –

0

これを試してください。まず、require rspecがファイルの先頭に表示されます。その後

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 

我々は上記のコメントで発見されたとして、あなたはrspecませruby

ので

rspec foo.rb 
+0

これは機能しませんでした。私はそれがexpect文でGame.newを呼び出すことと関係があると感じていますが、Game.newが呼び出されたときにプレーヤー名がインスタンス変数として初期化されるため、それ以外の方法についてはわかりません。そこから#playersメソッドを呼び出して、プレイヤーの名前が画面に表示されるようにしたいと思っています。 –

+0

取得しているエラーは何ですか? – nikkypx

関連する問題