2016-12-22 7 views
0

私は、time_stringメソッド内に複雑な条件文のWebを実装することでこれを解決する方法を知っています。しかし、私はSymbol#to_procメソッドの新しい知識を使用しようとしています。ご覧のとおり、私は 'padded'メソッドを構築しましたが、 '&'構文を使用して呼び出すようにしていますが、このエラーメッセージが返され続けます。私はさまざまなフォーマットを試しましたが、役に立たないものです。テスト初回Ruby - Timer: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 

:timer_spec.rbから

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 

RSpecのコード:timer.rbから

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

マイTimerクラスの定義:

私はこの同じエラーメッセージを取得しておきます端末からのエラーメッセージ:

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

あなたのケースでは、あなたがメソッドを追加する必要がいけない「​​DEF秒=(時間) "と"デフ秒 "手動で。あなたがattr_accessorを書いているときには、ルビーがあなたのためにそれを行うでしょう。 – sig

+0

あなたのspecのインデントを修正すれば、エラーは明らかになります。 – Stefan

+0

仕様を編集し、 'end'を下に移動して 'timer'スコープの中に 'time_string'を記述するようにしました。今、私はこれを得ています....失敗/エラー:期待値(@ timer.time_string).to eq( "00:00:00") NoMethodError: 未定義のメソッド 'padded 'for 0:Fixnum – Sedulity

答えて

0

"記述する"ブロックはほとんどありません。あなたは最初に "@timer"を定義しました。だから、それぞれの "記述"に

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

をコピーする必要があります。または、このブロックをより高い範囲に移動します。

も良い練習には、以下の修正必要なrspec`s let and let!

0

使用することです:とは対照的に、

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

を:

@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

関連する問題