2016-07-12 31 views
0

我只有幾天學習rspec,我試圖在包含類的程序中編寫我的第一個測試。我知道這個測試是錯誤的,但我不知道如何解決它,因爲我沒有失敗。相反,它只是開始貫穿我的程序(一個簡單的tic tac toe遊戲)。爲了簡潔,我省略了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將運行我的程序。我之所以這樣做是因爲對於我寫的所有其他實踐規範,我已經將該文件包含在我的ruby代碼中。我不應該這樣做嗎? –

回答

2

運行文件正如我們在上面的評論發現,問題是,tictactoe.rb具有運行你的整個代碼程序,所以require "tictactoe"也運行你的整個程序。

有兩種解決方案。

第一種方法是將tictactoe.rb更改爲只執行從命令行執行腳本時運行整個程序的代碼,而不執行其他腳本中的require d。這是在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 

現在你可以require "tictactoe"在測試中,知道在if塊中的代碼不會被執行。

第二種解決方案是將您的類聲明移動到其他文件中,例如,把遊戲類放在game.rb之內,並且有tictactoe.rbrequire "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 

然後確保你rspecruby

所以

rspec foo.rb 
+0

這沒有奏效。我有一種感覺,它與預期聲明中的Game.new調用有關,但我不知道如何去做,因爲當調用Game.new時,玩家名稱會被初始化爲實例變量。從那裏我希望能夠調用#players方法,然後確保將玩家的姓名放在屏幕上。 –

+0

你得到的錯誤是什麼? – nikkypx