Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Ruby Build a Todo List Application with Rails 4 Build a Todo List Application with Rails 4 Validating Length

rspec tests fail, but if I run them manually they should pass...

Not sure what I am doing wrong, but my rspec tests continue to fail. I can't find what's wrong with them. I do know that if I go to my localhost:3000 and run the tests manually, I do get the expected results of reach test. I'm not sure if this is because I am running a newer version of Rails or if it is something I've done—I am getting a bunch of deprecation warnings, too.

First, my rspec file:

require 'spec_helper'

describe "Creating todo lists" do
  it "redirects to the todo list index page on success" do
    visit "/todo_lists"
    click_link "New Todo list"
    expect(page).to have_content("New todo_list")     # <- 1. Change to "New Todo List"

    fill_in "Title", with: "My todo list"
    fill_in "Description", with: "This is what I'm doing to day."
    click_button "Create Todo list"

    expect(page).to have_content("My todo list")
  end

  it "displays an error when the todo list has no title" do
    expect(TodoList.count).to eq(0)

    visit "/todo_lists"
    click_link "New Todo list"
    expect(page).to have_content("New todo_list")     # 2. change to "New Todo List"

    fill_in "Title", with: ""
    fill_in "Description", with: "This is what I'm doing today."
    click_button "Create Todo list"

    expect(page).to have_content("error")
    expect(TodoList.count).to eq(0)

    visit "/todo_lists"
    expect(page).to_not have_content("This is what I'm doing today.")
  end

  it "displays an error when the todo list has a title of less than 3 characters" do
    expect(TodoList.count).to eq(0)

    visit "/todo_lists"
    click_link "New Todo list"
    expect(page).to have_content("New todo_list")     # 3. change to "New Todo List"

    fill_in "Title", with: "Hi"
    fill_in "Description", with: "This is what I'm doing today."
    click_button "Create Todo list"

    expect(page).to have_content("error")
    expect(TodoList.count).to eq(0)

    visit "/todo_lists"
    expect(page).to_not have_content("This is what I'm doing today.")
  end

end

Now my todo_list.rb:

class TodoList < ActiveRecord::Base
  validates :title, presence: true
  validates :title, length: { minimum: 3 }
end

And now the failures:

Failures:

  1) Creating todo lists redirects to the todo list index page on success
     Failure/Error: expect(page).to have_content("New todo_list")
       expected to find text "New todo_list" in "New Todo List Title Description Back"
     # ./spec/features/todo_lists/create_spec.rb:7:in `block (2 levels) in <top (required)>'

  2) Creating todo lists displays an error when the todo list has no title
     Failure/Error: expect(page).to have_content("New todo_list")
       expected to find text "New todo_list" in "New Todo List Title Description Back"
     # ./spec/features/todo_lists/create_spec.rb:21:in `block (2 levels) in <top (required)>'

  3) Creating todo lists displays an error when the todo list has a title of less than 3 characters
     Failure/Error: expect(page).to have_content("New todo_list")
       expected to find text "New todo_list" in "New Todo List Title Description Back"
     # ./spec/features/todo_lists/create_spec.rb:39:in `block (2 levels) in <top (required)>'

Deprecation Warnings:

--------------------------------------------------------------------------------
RSpec::Core::ExampleGroup#example is deprecated and will be removed
in RSpec 3. There are a few options for what you can use instead:

  - rspec-core's DSL methods (`it`, `before`, `after`, `let`, `subject`, etc)
    now yield the example as a block argument, and that is the recommended
    way to access the current example from those contexts.
  - The current example is now exposed via `RSpec.current_example`,
    which is accessible from any context.
  - If you can't update the code at this call site (e.g. because it is in
    an extension gem), you can use this snippet to continue making this
    method available in RSpec 2.99 and RSpec 3:

      RSpec.configure do |c|
        c.expose_current_running_example_as :example
      end

(Called from /Users/david/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/capybara-2.1.0/lib/capybara/rspec.rb:20:in `block (2 levels) in <top (required)>')
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
RSpec::Core::ExampleGroup#example is deprecated and will be removed
in RSpec 3. There are a few options for what you can use instead:

  - rspec-core's DSL methods (`it`, `before`, `after`, `let`, `subject`, etc)
    now yield the example as a block argument, and that is the recommended
    way to access the current example from those contexts.
  - The current example is now exposed via `RSpec.current_example`,
    which is accessible from any context.
  - If you can't update the code at this call site (e.g. because it is in
    an extension gem), you can use this snippet to continue making this
    method available in RSpec 2.99 and RSpec 3:

      RSpec.configure do |c|
        c.expose_current_running_example_as :example
      end

(Called from /Users/david/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/capybara-2.1.0/lib/capybara/rspec.rb:21:in `block (2 levels) in <top (required)>')
--------------------------------------------------------------------------------


If you need more of the backtrace for any of these deprecations to
identify where to make the necessary changes, you can configure
`config.raise_errors_for_deprecations!`, and it will turn the
deprecation warnings into errors, giving you the full backtrace.

2 deprecation warnings total

Finished in 0.81275 seconds
3 examples, 3 failures

Failed examples:

rspec ./spec/features/todo_lists/create_spec.rb:4 # Creating todo lists redirects to the todo list index page on success
rspec ./spec/features/todo_lists/create_spec.rb:16 # Creating todo lists displays an error when the todo list has no title
rspec ./spec/features/todo_lists/create_spec.rb:34 # Creating todo lists displays an error when the todo list has a title of less than 3 characters

Randomized with seed 61200

2 Answers

HI David,

Your tests are failing due to the content of your view. The three failures are identical.

Your test is expecting the page to display the string "New todo_list" but, instead and quite correctly, it is finding the non-matching string "New Todo List". This is what your three failures are all saying.

So, amend your tests in three places. Change this:

expect(page).to have_content("New todo_list")

... to this:

expect(page).to have_content("New Todo List")

... and that should fix all three errors. Your page should display "New Todo List" and not "New todo_list". Alternatively, change the content of the view to match the test; but I'd say that's incorrect. The non-underscored content is correct.

I hope that makes sense; shout if not.

Steve.

I have added three comments in your code posted above to help point out where the three changes need to be in your test code.

Thanks!!!!