Как удалить записи, используя функцию модели?

Я работаю над назначением направляющих, для которого требуется метод remove_entry в модели и рабочий тест для remove_entry. У меня возникли проблемы с прохождением теста. Есть ли у кого-нибудь рекомендации о том, как определить метод remove_entry в addressbook.rb, а также как записать тест в entry_spec.rb?

Entry.rb:

#Load a library called entry.rb
require_relative "entry.rb"

class AddressBook
  attr_accessor :entries

  def initialize
    @entries = []
  end

  def add_entry(name, phone, email)
    #Create a variable index to store
    index = 0
    @entries.each do |entry|
      if name < entry.name
        break
      end
      index += 1
    end

    @entries.insert(index,Entry.new(name,phone,email))
  end

  def remove_entry(entry)
    @entries.destroy(entry)
  end
end

Спецификация адресной книги:

RSpec.describe AddressBook do
  context "attributes" do
    it "should respond to entries" do
      book = AddressBook.new
      expect(book).to respond_to(:entries)
    end
    it "should initialize entries as an array" do
       book = AddressBook.new
       expect(book.entries).to be_a(Array)
     end

     it "should initialize entries as empty" do
       book = AddressBook.new
       expect(book.entries.size).to eq 0
     end
  end

  context ".add_entry" do
    it "adds only one entry to the address book" do
      book = AddressBook.new
      book.add_entry('Ada Lovelace', '010.012.1815', 'augusta.king@lovelace.com')

      expect(book.entries.size).to eq 1
    end

    it "adds the correct information to entries" do
       book = AddressBook.new
       book.add_entry('Ada Lovelace', '010.012.1815', 'augusta.king@lovelace.com')
       new_entry = book.entries[0]

       expect(new_entry.name).to eq 'Ada Lovelace'
       expect(new_entry.phone_number).to eq '010.012.1815'
       expect(new_entry.email).to eq 'augusta.king@lovelace.com'
    end
  end

  context ".remove_entry" do
    it "deletes one entry of the address book" do
      book.entries.delete_entry(entry)
      expect(book.entries.size).to eq 0
    end
  end
end

У меня также есть entry.rb и entry_spec.rb, но я считаю, что метод удаления будет в адресной книге, правильно? Поскольку запись удаляется из этой модели. Любые разъяснения будут с благодарностью.

1 ответ

Решение

Ты прав, что remove_entry метод должен быть в AddressBook так как он изменяет адресную книгу entries коллекция (и Entry класс не должен ничего знать о AddressBook или его внутренности).

Тем не менее, потому что ваш add_entry метод не подвергает Entry класс, который вы хотите сделать remove_entry работать так же, возможно, поиск записей по электронной почте (который должен быть уникальным, в отличие от имени, которое не может быть уникальным). Так что вы можете сделать что-то вроде этого:

def remove_entry(email)
  @entries.delete_if {|entry| entry.email == email}
end

Чтобы проверить этот метод, вы должны сделать что-то вроде этого:

context ".remove_entry" do
  it "deletes one entry of the address book" do
    book = AddressBook.new
    book.add_entry('Ada Lovelace', '010.012.1815', 'augusta.king@lovelace.com')

    book.delete_entry('augusta.king@lovelace.com')
    expect(book.entries.size).to eq(0)
  end
end
Другие вопросы по тегам