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
Welches Beispiel versagt? Können Sie die Fehlermeldung anzeigen? – Stefan
'Fehler/Fehler: expect (@ timer.seconds) .to eq (0) erwartet: 0 got: nil' – radioactive001
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