Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于类的Ruby测试,以及更改变量,让我陷入了困境。(我想很简单)_Ruby_Variables_Testing_Instances - Fatal编程技术网

关于类的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