anh nguyen
anh nguyen

Reputation: 29

Issue about Ruby class Timer in rspec

I am a Ruby newbie trying to create a class Timer with the following Rspec:

require 'timer'

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

  it "should initialize to 0 seconds" do
    @timer.seconds.should == 0
  end

  describe 'time_string' do
    it "should display 0 seconds as 00:00:00" do
      @timer.seconds = 0
      @timer.time_string.should == "00:00:00"
    end

    it "should display 12 seconds as 00:00:12" do
      @timer.seconds = 12
      @timer.time_string.should == "00:00:12"
    end

    it "should display 66 seconds as 00:01:06" do
      @timer.seconds = 66
      @timer.time_string.should == "00:01:06"
    end

    it "should display 4000 seconds as 01:06:40" do
      @timer.seconds = 4000
      @timer.time_string.should == "01:06:40"
    end
  end

But I don't understand the Rspec's return error message, which says "Timer should initialize to 0 seconds", I am stuck at the beginning with my code and really appreciate anyone who can explain what's wrong with my code below. Thanks.

class Timer
    def intialize(seconds)
        @seconds = seconds
    end
    def seconds=(new_seconds = 0)
        @seconds = new_seconds
    end
    def seconds
        @seconds
    end
end

Upvotes: 1

Views: 916

Answers (3)

K.S.A.
K.S.A.

Reputation: 1

Trying to solve this in most "lazy" way. Test works fine, but I think there must be short and optimized way to solve it.

class Timer
      attr_accessor  :seconds
  def initialize seconds=0
      @seconds = seconds
  end
  def time_string
      res=[]
      [email protected](3600)
      if tt<10
         tt = '0' + tt.to_s
      end
      res.push(tt)
      tt=(@[email protected](3600)*3600).div(60)
      if tt<10
         tt = '0' + tt.to_s
      end
         res.push(tt)
         tt=@[email protected](3600)*3600-((@[email protected](3600)*3600).div(60))*60
      if tt<10
         tt = '0' + tt.to_s
      end
  res.push(tt)
  res.join(':')
  end
end

Upvotes: 0

Jeremiah McCurdy
Jeremiah McCurdy

Reputation: 612

Stefan's answer is good, but I used the below code and it works perfectly for the rest of the problem you are working on.

class Timer
  attr_accessor :seconds

  def initialize
    @seconds = 0
  end
end

The attr_accessor creates the instance variable @seconds, and it is initialized to 0. I cannot take credit for this answer though. I found it and its very thorough explanation on this stackoverflow page: What is attr_accessor in Ruby?

So thank you hakunin.

Upvotes: 1

Stefan
Stefan

Reputation: 114248

I think your initialize method should take the optional argument:

class Timer
  def initialize(seconds = 0)
    @seconds = seconds
  end
  def seconds=(new_seconds)
    @seconds = new_seconds
  end
end

Upvotes: 2

Related Questions