
Unsubscribed User
11,041 PointsWhy I need to pass the todo_list when I have the todo_list method defined with let?
I can't figure out why we still pass the todo_list obj to the update_todo_list method... We already have a "todo_list" memoized method! Please have a look at the comments I wrote :-)
require 'spec_helper'
describe "Editing todo lists" do
let!(:todo_list) { TodoList.create(title: "Groceries", description: "Grocery list.") }
def update_todo_list(options={})
options[:title] ||= "My todo list"
options[:description] ||= "This is my todo list."
#WE USED LET, WHY THIS STATEMENT?
todo_list = options[:todo_list]
visit "/todo_lists"
within "#todo_list_#{todo_list.id}" do
click_link "Edit"
end
fill_in "Title", with: options[:title]
fill_in "Description", with: options[:description]
click_button "Update Todo list"
end
it "updates a todo list successfully with correct information" do
update_todo_list todo_list: todo_list,
title: "New title",
description: "New description"
todo_list.reload
expect(page).to have_content("Todo list was successfully updated")
expect(todo_list.title).to eq("New title")
expect(todo_list.description).to eq("New description")
end
it "displays an error with no title" do
#WE USED LET, WHY PASS THE todo_list OBJECT?
update_todo_list todo_list: todo_list, title: ""
title = todo_list.title
todo_list.reload
expect(todo_list.title).to eq(title)
expect(page).to have_content("error")
end
it "displays an error with too short a title" do
update_todo_list todo_list: todo_list, title: "hi"
expect(page).to have_content("error")
end
it "displays an error with no description" do
update_todo_list todo_list: todo_list, description: ""
expect(page).to have_content("error")
end
it "displays an error with too short a description" do
update_todo_list todo_list: todo_list, description: "hi"
expect(page).to have_content("error")
end
end
1 Answer

Ilya Dolgirev
35,375 PointsThe idea of this spec is to test whole feature and not the model and its methods itself.
This helper method update_todo_list
is using Capybara to imitate real user interaction with the page.
That is why you have to clearly define the todo object you're trying to update because in real app you'll have many lists as user.