待办事项清单以及Ruby中的类

时间:2018-11-08 22:42:04

标签: ruby class

我正在挑战,但我坚持至今尚无法解决的问题。我还发现打开了一个与此主题非常相似的主题,但是它处于我现在所处的同一阶段,“ rspec”表示我的代码仍然存在问题。

下面是挑战:

编写一个包含待办事项列表的程序。它应该:

  • 有两节课:
    • Todo
      • 有两种方法:
      • initialize:创建一个新的待办事项对象。将字符串作为 参数并将其存储在todo对象上。
      • text:不接受任何参数。返回原为 在创建todo对象时存储。
    • TodoList
      • 具有三种方法:
      • initialize:创建一个新的待办事项列表对象。不接受任何参数。
      • add:将待办事项对象作为参数。将其存储在 待办事项列表对象。
      • print:不接受任何参数。创建一个所有的字符串 存储的待办事项,每行一个。每行应以 *puts是字符串。 例如
        • 喝牛奶
        • 获取论文

这是我的代码:

class Todo
  def initialize(string)
    @string = string
  end

  def text
    @string
  end
end

class TodoList
  def initialize
    @todolist = []
  end

  def add(todo)
    @todolist << Todo.new(todo)
  end

  def print
    @todolist.each do |item|
    puts "* get #{item.text}"
  end
 end
end

这是我得到的错误:

Failure/Error: expect { todo_list.print }.to output("* get 
milk\n").to_stdout

   expected block to output "* get milk\n" to stdout, but output "* get #<Todo:0x007f8766831f90>\n"
   Diff:
   @@ -1,2 +1,2 @@
   -* get milk
   +* get #<Todo:0x007f8766831f90>

 # ./spec/question_1_spec.rb:43:in `block (5 levels) in <top (required)>

这是规格代码:

 describe "Q1. Todo list" do
   describe Todo do
    describe "creating a new Todo" do
     it "creates a new todo object" do
      expect(Todo.new("get milk")).to be_instance_of Todo
     end
   end

describe "getting text on todo" do
  it "returns text stored on todo" do
    expect(Todo.new("get milk").text).to eq("get milk")
  end
end
end

describe TodoList do
  describe "creating a TodoList" do
    it "creates a new todo list object" do
     expect(TodoList.new).to be_instance_of TodoList
   end
 end

describe "adding todos" do
  let(:todo) { Todo.new("get milk") }
  let(:todo_list) { TodoList.new }

   it "adds a todo without raising an error" do
    expect { todo_list.add(todo) }.to_not raise_error
   end
  end

describe "printing todos" do
  let(:todo) { Todo.new("get milk") }
  let(:todo_list) { TodoList.new }

  context "one todo" do
    it "prints a single todo with a bullet point" do
      todo_list.add(todo)

      expect { todo_list.print }.to output("* get milk\n").to_stdout
    end
  end

  context "many todos" do
    let(:todo_1) { Todo.new("get milk") }
    let(:todo_2) { Todo.new("get the paper") }
    let(:todo_3) { Todo.new("get orange juice") }
    let(:todo_list) { TodoList.new }

    let(:expected_output) { ["* get milk",
                            "* get the paper",
                            "* get orange juice"].join("\n") +
                           "\n" }

    it "prints the todos, separated by newlines" do
      todo_list.add(todo_1)
      todo_list.add(todo_2)
      todo_list.add(todo_3)

      expect { todo_list.print }.to output(expected_output).to_stdout
    end
  end
end
end

1 个答案:

答案 0 :(得分:0)

这是rspec手动完成的操作:

todo = Todo.new("get milk")
todo_list = TodoList.new
todo_list.add(todo)
todo_list.print
#=> * #<Todo:0x007fb3e40f1b40>

碰巧打印方法正在打印@todolist数组的内容。 @todolist中有什么? 查看add方法:

@todolist << Todo.new(todo)

因此,最好将Todo对象添加到数组中,它首先创建一个新的Todo实例,并传递接收到的Todo对象作为参数。有点嵌套。就像打电话:

todo2 = Todo.new("get milk")
todo3 = Todo.new(todo2)
puts todo3 #=> #<Todo:0x007fe20a02c968>

通过以下方法解决方法add的改变:

def add(todo)
  @todolist << todo
end

现在它应该工作了:

todo = Todo.new("get milk")
todo_list = TodoList.new
todo_list.add(todo)
todo_list.print
#=> * get milk