我正在挑战,但我坚持至今尚无法解决的问题。我还发现打开了一个与此主题非常相似的主题,但是它处于我现在所处的同一阶段,“ 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
答案 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