关于类的Ruby测试,以及更改变量,让我陷入了困境。(我想很简单)
我不知道该怎么办,也不知道如何解决这个问题关于类的Ruby测试,以及更改变量,让我陷入了困境。(我想很简单),ruby,variables,testing,instances,Ruby,Variables,Testing,Instances,我不知道该怎么办,也不知道如何解决这个问题 #This is the test require 'book' describe Book do before do @book = Book.new end describe 'title' do it 'should capitalize the first letter' do @book.title = "inferno" expect(@book.title).to eq("Infern
#This is the test
require 'book'
describe Book do
before do
@book = Book.new
end
describe 'title' do
it 'should capitalize the first letter' do
@book.title = "inferno"
expect(@book.title).to eq("Inferno")
end
end
我试过这样的方法:
class Book
def title string
@title = string.to_s.capitalize
end
end
@book = Book.new
puts @book.title("inferno")
require 'book'
describe Book do
before do
@book = Book.new
end
describe 'title' do
it 'should capitalize the first letter' do
@book.title = 'inferno'
expect(@book.title).to eq('Inferno')
end
it 'should leave the first letter capitalized if it is already' do
@book.title = 'Hannibal'
expect(@book.title).to eq('Hannibal')
end
end
end
class Book
attr_reader :title
def title=(title)
@title = titleize(title)
end
private def titleize(title)
title.capitalize
end
end
这可以工作,但测试失败,因为测试需要:
@book.title = "inferno"
但我用上述代码行尝试的所有操作都失败了,我收到一条错误消息,以某种方式声明:
"undefined method 'title=' for #<Book" etc
但我不知道发生了什么。为什么在“=”后面有一个参数
为什么有一个“title”方法,然后是一个“title=”
@title=titlieze(title)在做什么
看着这段代码,我甚至无法对其进行反向工程,也无法理解发生了什么
如果有人能给我一些见解,我将不胜感激。这太简单了
title=
看起来像是一个赋值重载,但它只是一个方法。如果需要,可以使用“setter方法”。这是当您使用attr\u writer
时发生的情况
attr_writer :title
是这样定义title=
方法的方法
def title=(value)
@title = value
end
TDD和BDD的好处在于——至少假设您使用的是一个不错的测试框架,并且您的测试编写得很好——您的测试将告诉您下一步要做什么。你只需要听听你的测试 在每一步中,只要做最简单的事情来更改消息即可 那么,让我们这样做。让我们简单地运行测试,并听听它告诉我们什么: 现在再次运行测试: 下面是我们现在得到的新错误: 万岁!考试通过了!我们的
书
课程运行完美!它通过了测试,代码简短易读,并且只做了它需要做的最小的事情,没有多余的绒毛
好吧,不,显然不是。在一个“真正”的项目中,测试还不会通过,会有另一个测试尝试相同的事情,但书名不同。想象一下,测试看起来更像这样:
class Book
def title string
@title = string.to_s.capitalize
end
end
@book = Book.new
puts @book.title("inferno")
require 'book'
describe Book do
before do
@book = Book.new
end
describe 'title' do
it 'should capitalize the first letter' do
@book.title = 'inferno'
expect(@book.title).to eq('Inferno')
end
it 'should leave the first letter capitalized if it is already' do
@book.title = 'Hannibal'
expect(@book.title).to eq('Hannibal')
end
end
end
class Book
attr_reader :title
def title=(title)
@title = titleize(title)
end
private def titleize(title)
title.capitalize
end
end
万岁!考试通过了!现在是执行BDD的下一步:有信心我们有一个通过测试的套件,它将捕获我们犯的任何错误,我们将重构代码。在这种特殊情况下,我们实际上只能做一件事:我们可以使用属性读取器方法替换平凡的title
方法,该方法将为我们生成一个方法,该方法的功能与我们手动执行的几乎相同:
class Book
attr_reader :title
def title=(title)
@title = title.capitalize
end
end
测试仍然通过,我们的程序已经完成
另一种选择是:
class Book
def title=(title)
@title = title
end
def title
@title.capitalize
end
end
测试再次通过,最后剩下的步骤是重构。这一次,是title=
方法非常简单,我们可以让它为我们生成:
class Book
attr_writer :title
def title
@title.capitalize
end
end
如果我们真的想,我们可以考虑如何将标题转换为单独的助手方法。这有两个优点:如果我们需要在代码中的不同位置执行此转换,那么关于如何执行此转换的知识不会在多个位置重复,而是集中在一个位置。然而,请注意,目前,这违反了雅格尼(你不需要它)不试图预测未来的原则。然而,还有第二个好处,那就是它允许我们为这个转换附加一个名称。所以,我们可以这样做:
class Book
def title string
@title = string.to_s.capitalize
end
end
@book = Book.new
puts @book.title("inferno")
require 'book'
describe Book do
before do
@book = Book.new
end
describe 'title' do
it 'should capitalize the first letter' do
@book.title = 'inferno'
expect(@book.title).to eq('Inferno')
end
it 'should leave the first letter capitalized if it is already' do
@book.title = 'Hannibal'
expect(@book.title).to eq('Hannibal')
end
end
end
class Book
attr_reader :title
def title=(title)
@title = titleize(title)
end
private def titleize(title)
title.capitalize
end
end
或
也称为
虚拟属性
.Hi。谢谢你的回复。我仍然不完全理解,但我认为你已经给了我足够的时间让我开始理解。谢谢。显然,这只是一个以=:D结尾的方法
class Book
def title=(_) end
end
undefined method `title' for #<Book:0x007fd10102be60>
class Book
def title=(_) end
def title; end
end
expected: "Inferno"
got: nil
class Book
def title=(_) end
def title; 'Inferno' end
end
require 'book'
describe Book do
before do
@book = Book.new
end
describe 'title' do
it 'should capitalize the first letter' do
@book.title = 'inferno'
expect(@book.title).to eq('Inferno')
end
it 'should leave the first letter capitalized if it is already' do
@book.title = 'Hannibal'
expect(@book.title).to eq('Hannibal')
end
end
end
expected: "Hannibal"
got: "Inferno"
class Book
def title=(title)
@title = title
end
def title
@title
end
end
expected: "Inferno"
got: "inferno"
class Book
def title=(title)
@title = title.capitalize
end
def title
@title
end
end
class Book
attr_reader :title
def title=(title)
@title = title.capitalize
end
end
class Book
def title=(title)
@title = title
end
def title
@title.capitalize
end
end
class Book
attr_writer :title
def title
@title.capitalize
end
end
class Book
attr_reader :title
def title=(title)
@title = titleize(title)
end
private def titleize(title)
title.capitalize
end
end
class Book
attr_writer :title
def title
titleize(@title)
end
private def titleize(title)
title.capitalize
end
end