代码突然不再通过rspec ......需要新鲜的眼睛

时间:2015-04-12 04:34:18

标签: ruby rspec

我让这段代码前几天传递了所有规格,所以我把它移到另一个文件夹中(完成作业)。当我尝试从那里再次运行规范时,尽管按照我看到的方式完全键入了路径(几次),但我无法加载文件。 Hmmmm。是否有一些特殊的方法从子文件夹运行rspecs?无论如何,所以我把它移回了它所在的主目录,并从那里尝试,突然它不会通过!!我一定是不小心删了东西。但是对于我的生活差不多两天......我只是看看它。我已经完成了一百万次,看起来它应该正常工作,当我把这些方法带出课堂时,它们按预期返回。我需要新鲜的眼睛。为什么这段代码突然没有通过?

class :: Timer
  attr_accessor :seconds, :padded, :time_string

  def initialize(seconds = 0)
    @seconds = seconds
  end 

  def padded(num)
    num = num.to_s
    num.length == 1 ? "0#{num}" : "#{num}"
  end

  def time_string=(seconds)
    @seconds = seconds
    mins = 0
    hours = 0

    if seconds == 0 
      return "00:00:00"
    elsif seconds < 60
      return "00:00:#{padded(seconds)}"
    end

    while seconds > 59
      mins += 1
      seconds -= 60
      if mins > 59
         hours += 1
         mins -= 60
      end  
    end#while
  return "#{padded(hours)}:#{padded(mins)}:#{padded(seconds)}"
  end
end#class

以下是规格:

require_relative '09_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



  # One way to implement the Timer is with a helper method.
  # Uncomment these specs if you want to test-drive that
  # method, then call that method from inside of time_string.
  #
  describe 'padded' do
     it 'pads zero' do
       @timer.padded(0).should == '00'
     end
     it 'pads one' do
       @timer.padded(1).should == '01'
     end
     it "doesn't pad a two-digit number" do
       @timer.padded(12).should == '12'
     end
   end

end

1 个答案:

答案 0 :(得分:1)

class :: Timer
  attr_accessor :seconds

  def initialize(seconds = 0)
    @seconds = seconds
  end

  def padded(num)
    num = num.to_s
    num.length == 1 ? "0#{num}" : "#{num}"
  end

  def time_string
    seconds = @seconds
    mins = 0
    hours = 0

    if seconds == 0
      return "00:00:00"
    elsif seconds < 60
      return "00:00:#{padded(seconds)}"
    end

    while seconds > 59
      mins += 1
      seconds -= 60
      if mins > 59
         hours += 1
         mins -= 60
      end
    end#while
  return "#{padded(hours)}:#{padded(mins)}:#{padded(seconds)}"
  end
end#class

功能

require_relative '09_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



  # One way to implement the Timer is with a helper method.
  # Uncomment these specs if you want to test-drive that
  # method, then call that method from inside of time_string.
  #
  describe 'padded' do
     it 'pads zero' do
       expect(@timer.padded(0)).to eq '00'
     end
     it 'pads one' do
       expect(@timer.padded(1)).to eq '01'
     end
     it "doesn't pad a two-digit number" do
       expect(@timer.padded(12)).to eq '12'
     end
   end

end

我真的不知道你的代码是如何搞砸的,但是time_string方法并没有在你的规范中采用任何参数,我也不明白它为什么会这样从逻辑的角度来看。因此,我从方法签名中取出=(seconds)部分。

您还将实例变量@seconds设置为传递的参数,但实际上我们想要使用以实例变量开头的本地seconds变量,以便只需将其翻转为{ {1}}。

最后,我更改了您的规范,使用新的seconds = @seconds语法而不是expect should