Список задач с занятиями по Ruby - PullRequest
0 голосов
/ 09 ноября 2018

Я выполняю этот вызов, но я застрял на чем-то, что до сих пор не смог понять. Я также обнаружил, что открытая тема очень похожа на эту, но она находится на той же стадии, на которой я сейчас нахожусь, и «rspec» говорит, что с моим кодом все еще что-то не так.

Ниже есть вызов:

Напишите программу, которая хранит список задач. Стоит:

  • Есть два класса:
    • Todo
      • Имеет два метода:
      • initialize: создает новый объект todo. Принимает строку как параметр и сохраняет его в объекте todo.
      • text: не принимает параметров. Возвращает строку, которая была сохраняется при создании объекта todo.
    • TodoList
      • Имеет три метода:
      • initialize: Создает новый объект списка задач. Не принимает параметров.
      • add: принимает объект todo в качестве параметра. Хранит его на объект списка задач.
      • 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 голосов
/ 10 ноября 2018

Это делается вручную, что делает rspec:

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

Бывает, что метод print печатает содержимое массива @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...