2015-02-05 56 views
0

我是新的ruby代碼。我的團隊成員編寫類甲板實現遊戲設置爲什麼我不能在我的新rspec版本中使用期望值相等

class Deck 
    @array = Array.new 

    # create a deck of n cards 
    # n <= 0 returns empty array. 
    def initialize (n=1) 
    @array = (0..n-1).to_a 
    end 
end 

我嘗試寫rspec的測試,這也是新的給我們,這裏的測試代碼:

#!/user/bin/ruby -w 
require '../deck' 
require 'rspec/expectations' 

describe "Deck#new" do 
    context "with one parameter " do 
    it "has parameter n = 0" do 
     expect(Deck.new(0)).to match_array([]) 
    end 

    it "has parameter n = 1" do 
     expect(Deck.new(1)).to eq([0]) 
    end 

    it "has parameter n = 5" do 
     expect(Deck.new(5))==([0,1,2,3,4]) 
    end 

    it "has parameter n<0" do 
     expect(Deck.new(-1))==([]) 
    end 
    end 
end 

但是當我運行該測試,它給我

expected a collection that can be converted to an array with `#to_ary` or `#to_a`, but got #<Deck:0xb82edb74 @array=[]> 

和前兩個失敗,我不明白。我在代碼中錯過了什麼嗎?感謝幫助。我的rspec版本是最新的。

+0

肯定。我以爲我們不應該使用運營商? @Stefan – Echo 2015-02-05 16:10:22

+0

我不認爲'expect(a)== b'正在做任何事情。 [正確的語法](https://www.relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/equality-matchers#compare-using- (a).to == b' – Stefan 2015-02-05 16:17:50

+0

順便說一句,代替'(0..n-1)',你可以使用'(0 ... n)'(3個點) – Stefan 2015-02-05 16:19:06

回答

2

您需要一種方法來訪問卡:

class Deck 
    def initialize (n=1) 
    @array = (0..n-1).to_a 
    end 
    def cards 
    @array 
    end 
end 

這樣:

Deck.new(5).cards 
#=> [0, 1, 2, 3, 4] 

因此,改變你的測試:

it "has parameter n = 0" do 
expect(Deck.new(0).cards).to match_array([]) 
end 

等.. 。

更新:
Deck.new(n)返回整個對象

Deck.new(5) 
=> #<Deck:0x007fb56b0e82b0 @array=[0, 1, 2, 3, 4]> 

出於這個原因,你的測試將失敗......整個對象是不一樣的@array[0, 1, 2, 3, 4])的內容。

更新2:
您可以在甲板上定義任何新的方法,例如數OS卡:

class Deck 
    def initialize (n=1) 
    @array = (0..n-1).to_a 
    end 
    def cards 
    @array 
    end 
    def number_of_cards 
    @array.size 
    end 
end 

Deck.new(5).number_of_cards 
#=> 5 
+0

這似乎是我的隊友寫的代碼需要稍微改變。因爲在使用@array之後他執行的所有方法都是這樣。例如:'#返回n個隨機卡陣列 def pick_n(n) (n <= 0)? @ array.sample(0):@ array.sample(n) end'他用這個,我們應該改變一些東西。我對這種語言是全新的,請耐心等待:) – Echo 2015-02-05 16:21:15

+0

如果沒有'def cards',你會得到帶有正確的'@ array'的'Deck'對象,但是你不能從對象中獲取數組內容。 'def cards'可以讓你獲得這個信息('object.cards'),返回'@ array'的內容。在你的測試中,'Deck.new(0)'是整個對象,而不是'@ array'的內容,因此它沒有通過測試。 – gabrielhilal 2015-02-05 16:25:54

+0

所以如果我想測試另一種方法,我可以使用** Deck.new(5).new_method **?但它給了我錯誤的參數錯誤。 – Echo 2015-02-05 16:33:43

相關問題