Как удалить записи, используя функцию модели?
Я работаю над назначением направляющих, для которого требуется метод 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