2017-08-02 87 views
1

我有一個RSpec問題。根據這個問題,我用紅寶石寫了一個解決方案。但使用RSpec運行時,當我期望得到的值,我在這裏得到nil是RSpec的Ruby返回意外無

require 'timer' 

describe "Timer" do 
    before(:each) do 
    @timer = Timer.new 
    end 

    it "should initialize to 0 seconds" do 
    expect(@timer.seconds).to eq(0) 
    end 

    describe 'time_string' do 
    it "should display 0 seconds as 00:00:00" do 
     @timer.seconds = 0 
     expect(@timer.time_string).to eq("00:00:00") 
    end 

    it "should display 12 seconds as 00:00:12" do 
     @timer.seconds = 12 
     expect(@timer.time_string).to eq("00:00:12") 
    end 

    it "should display 66 seconds as 00:01:06" do 
     @timer.seconds = 66 
     expect(@timer.time_string).to eq("00:01:06") 
    end 

    it "should display 4000 seconds as 01:06:40" do 
     @timer.seconds = 4000 
     expect(@timer.time_string).to eq("01:06:40") 
    end 
    end 

這是我寫的解決方案:

class Timer 
    attr_accessor :seconds, :time_string 


    def seconds=(num) 
    @seconds=num 
    end #seconds 


    def time_string 
     [email protected]%60 
     [email protected]/60 
     h=m/60 
     m=m%60 
     @time_string="%02d:%02d:%02d" %[h,m,s] 
    end #time_string 
end #class 

錯誤我得到

Failure/Error: expect(@timer.seconds).to eq(0) 

     expected: 0 
      got: nil 
+0

例如哪些失敗?你能顯示失敗的消息嗎? – Stefan

+0

'失敗/錯誤:expect(@ timer.seconds).to eq(0) expected:0 got:nil' – radioactive001

+1

順便說一下,你的'seconds ='方法是多餘的 - 'attr_accessor:seconds'實現了該方法您。另一方面,你可以刪除'attr_accessor:time_string',因爲你可能不想從外面設置'@ time_string'。也就是說,'@ time_string ='是多餘的(實例變量從不使用),你可以返回字符串。你可能想看看['divmod'](http://ruby-doc.org/core-2.4.1/Numeric.html#method-i-divmod),例如'h,m = m.divmod(60)' – Stefan

回答

3

這是因爲你沒有任何參數初始化Timer.new。因此,secondsnil

您需要用:

before(:each) do 
    @timer = Timer.new 
    @timer.seconds = 0 
end 

或實現一個初始化:

class Timer 
    attr_accessor :seconds, :time_string 

    def initialize 
    @seconds = 0 
    end 
    ... 
+0

哦,我明白了..謝謝。這就是訣竅:) – radioactive001