2017-08-02 7 views
1

Ich habe ein RSpec-Problem. Nach diesem Problem habe ich eine Lösung in Ruby geschrieben. Aber wenn sie mit RSpec läuft Wo erwarte ich einen Wert zu erhalten, erhalte ich nil hier ist die RSpecRuby Returning unerwartete Null

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 

Hier ist die Lösung, die ich schrieb:

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 

Fehler Ich erhalte

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

     expected: 0 
      got: nil 
+0

Welches Beispiel versagt? Können Sie die Fehlermeldung anzeigen? – Stefan

+0

'Fehler/Fehler: expect (@ timer.seconds) .to eq (0) erwartet: 0 got: nil' – radioactive001

+1

BTW, Ihre' seconds = 'Methode ist redundant -' attr_accessor: seconds' implementiert diese Methode für Sie. Auf der anderen Seite können Sie 'attr_accessor: time_string' entfernen, da Sie' 'time_string' 'wahrscheinlich nicht von außen setzen wollen. Das heißt, '@ time_string =' ist überflüssig (die Instanzvariable wird nie benutzt), Sie können die Zeichenfolge einfach zurückgeben. Und vielleicht möchten Sie [divmod'] (http://ruby-doc.org/core-2.4.1/Numeric.html#method-i-divmod), z. 'h, m = m.divmod (60)' – Stefan

Antwort

3

Das liegt daran, dass Sie Timer.new ohne Argumente initialisieren. Somit ist die secondsnil

Sie müssen entweder:

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

Oder einen Initialisierer implementieren:

class Timer 
    attr_accessor :seconds, :time_string 

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

Ohh ich sehe .. Danke. Das hat den Trick gemacht :) – radioactive001