运行RSpec时出现问题 - 我错过了什么?

时间:2015-08-09 03:07:15

标签: ruby-on-rails ruby rspec

我正在尝试使用Rspec运行测试程序但是在运行代码时遇到了一些问题。我是一名编程初学者,所以我很欣赏这些建议:)

Rspec测试是:

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

  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

Ruby代码是:

class Timer
  def seconds 
    0
  end

  def time_string
    "00:00:00" 
  end   
end

有人可以提供建议吗?

当我跑步时,我会收到: undefined method `seconds=' for #<Timer:0x00000001b671b8>错误

1 个答案:

答案 0 :(得分:2)

这个问题与RSpec没有任何关系。问题出在这里:

@timer.seconds = 0

这对您定义的课程没有任何意义。您还没有告诉班级seconds =的含义,因此您收到错误undefined method `seconds='

在您的课程中,您有一个名为seconds的方法:

def seconds 
  0
end

...但是当你致电0时,所有这个方法都会返回@timer.seconds。它没有做任何其他事情。

如果您想要致电@timer.seconds = x,您需要在课堂上定义一种方法。一种方法是定义seconds=方法:

class Timer
  def seconds=(num)
    @seconds = num
  end
  # ...
end

使用此方法,当您致电@timer.seconds = 3时,您实际上使用参数seconds=调用方法3,而seconds=方法指定3 1}}到实例变量@seconds(因为你需要在某个地方将值存储在类的实例中)。

这在Ruby中很常见,它有一个快捷方式,类方法attr_writer(&#34; attr&#34;是&#34;属性&#34;的缩写),你这样用:

class Timer
  attr_writer :seconds
  # ...
end

所有这一切都是为我们创建seconds=方法,就像上面的代码一样。

但是现在我们已经在@seconds实例变量中存储了一个值,我们如何将其恢复出去?如果我们希望@timer.seconds返回3(我们称之为seconds=的值),我们需要seconds方法返回@seconds实例变量的值。这很简单:

class Timer
  attr_writer :seconds # (from above)

  def seconds
    @seconds
  end
  # ...
end

现在我们可以使用seconds=存储一个值并使用seconds将其恢复:

@timer = Timer.new
@timer.seconds = 60
puts @timer.seconds
# => 60

但正如您可能已经猜到的那样,我们也有一个快捷方式 - attr_reader类方法:

class Timer
  attr_writer :seconds
  attr_reader :seconds
  # ...
end

但是我们还有一个捷径 - 如果我们有attr_readerattr_writer同名,我们可以使用类方法attr_accessor

class Timer
  attr_accessor :seconds
  # ...
end

@timer = Timer.new
@timer.seconds = 5
puts @timer.seconds
# => 5