A Test with a View
Learn how to add some more tests, code for the view, and view tests, and learn about refactoring the code.
We'll cover the following...
Making the test pass
Let’s look at that end-to-end test again:
require "rails_helper"RSpec.describe "adding a project", type: :system doit "allows a user to create a project with tasks" dovisit new_project_pathfill_in "Name", with: "Project Runway"fill_in "Tasks", with: "Choose Fabric:3\nMake it Work:5"click_on("Create Project")visit projects_pathexpect(page).to have_content("Project Runway")expect(page).to have_content(8)endend
So far, this test passes up to the point where the code completes the controller create action. At the end of that action, it redirects to projects_path
, which we didn’t know when we started the end-to-end test, and it might mean that we don’t need to explicitly visit projects_path
in the test. Either way, projects_path
triggers a visit to the path /projects
, which is routed to the index
method of the ProjectController
. Since there isn’t an index
method, the current error is The action 'index' could not be found for ProjectsController
.
We need the index
method:
class CreatesProject attr_accessor :name, :project, :task_string def initialize(name: "", task_string: "") @name = name @task_string = task_string end def build self.project = Project.new(name: name) project.tasks = convert_string_to_tasks project end def create build project.save end def convert_string_to_tasks task_string.split("\n").map do |one_task| title, size_string = one_task.split(":") Task.new(title: title, size: size_as_integer(size_string)) end end def size_as_integer(size_string) return 1 if size_string.blank? [size_string.to_i, 1].max end end
Now we have an action without a view that results in the error message that starts with the following:
ActionController::MissingExactTemplate:
ProjectsController#index is missing a template for request formats: text/html`
To get past this error, we create a blank view file at ...