我正在尝试使用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>
错误
答案 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_reader
和attr_writer
同名,我们可以使用类方法attr_accessor
:
class Timer
attr_accessor :seconds
# ...
end
@timer = Timer.new
@timer.seconds = 5
puts @timer.seconds
# => 5