2016-12-22 21 views
0

我知道如何通过在time_string方法内部实现复杂的条件语句网络来解决此问题。但是,我试图使用Symbol#to_proc方法的新知识。正如你所看到的,我建立了'填充'方法,我试图用'&'语法来调用它,但是我不断收到此错误消息。我尝试了许多不同的格式,但无济于事。测试第一个Ruby - 定时器:在time_string方法中实现Symbol#to_proc的问题

我不断收到此相同的错误消息:

# # Topics 
# 
# * classes 
# * instance variables 
# * string formats 
# * modular arithmetic 
# 
# # Timer 

require '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 


    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 

    describe "time_string" do 

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

    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 
end 

class Timer 
    attr_accessor :seconds 

    def initialize 
    @seconds = 0 
    end 

    def padded n 
    "#{n}".rjust(2, '0') 
    end 

    def time_string 
    t_hours = @seconds/3600 
    t_mins = (@seconds % 3600)/60 
    t_seconds = @seconds % 60 
    @time_string = [t_hours, t_mins, t_seconds].map(&:padded).join(":") 
    end 
end 

从timer_spec.rb RSpec的代码:

"Undefined method 'seconds=' for nil:NilClass" 

我的定时器类从timer.rb定义来自我的终端的错误消息:

MacBook-Air:test1 ***$ bundle exec rspec spec/09_timer_spec.rb 

Timer 
    should initialize to 0 seconds 
    pads zero 
    pads one 
    doesn't pad a two-digit number 
    time_string 
    should display 0 seconds as 00:00:00 (FAILED - 1) 

Failures: 

    1) Timer time_string should display 0 seconds as 00:00:00 
    Failure/Error: expect(@timer.time_string).to eq("00:00:00") 
    NoMethodError: 
     undefined method `padded' for 0:Fixnum 
+0

@time_string = [t_hours, t_mins, t_seconds].map(&method(:padded)).join(":") 

至于反对时间)“和”def秒“。当你编写attr_accessor时:秒ruby会为你做这个 – sig

+0

修正你的spec的缩进,并且错误变得明显。 – Stefan

+0

刚刚编辑规范,将“结束”移到底部,在描述的“定时器”范围内包含describe'time_string'。现在我得到这个....失败/错误:期望(@ timer.time_string).to eq(“00:00:00”) NoMethodError: 未定义的方法'填充'为0:Fixnum – Sedulity

回答

0

你有几个“描述”块。您只在第一次定义“@timer”。所以,你应该复制

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

到每个的 “描述” S。或者将这个块移到更高的范围。

还不错的做法是使用rspec`s let and let!

0

需要以下的解决办法:在你的情况你不需要添加方法“高清秒=(

@time_string = [t_hours, t_mins, t_seconds].map(&:padded).join(":") 
+0

是因为'padded'方法对于这个类是本地的,不包含在Ruby库中? @Stefan – Sedulity

+0

https://andrewjgrimm.wordpress.com/2011/10/03/in-ruby-method-passes-you/ – Sedulity

相关问题