Basic TDD in Rails : Writing View Tests

Objective


To learn how to write a view test.

Steps


Step 1

$rake spec

The feature tests fail. The feature tests in manage_articles_spec.rb does not seem to work with existing configuration in database_cleaner.rb.

Step 2

We no longer it, since we test those in the controller tests. Delete the feature spec and run rake spec again.

Step 3

Add a view test in app/views/articles/index.html.erb_spec.rb.

require 'rails_helper'

describe "articles/index.html.erb", type: :view do
  it 'displays all the articles' do
    assign(:articles, [
      Article.create!(title: 'test', description: 'description'),
      Article.create!(title: 'test2', description: 'description2')
    ])

    render

    expect(rendered).to match /test/
    expect(rendered).to match /test2/
  end
end

Step 4

Run :

$rake spec.

Now the coverage has dropped to 93.94 %. Look at the report by doing :

$open coverage/index.html

We see that the new and show action is not tested. Let's add controller specs to bring up our coverage back to 100%.

Step 5

Add this :

    it 'should not load new article page' do
      get :new

      expect(response.code).to eq('401')
    end

to the context for admin not logged in. Run the controller test.

Step 6

rspec spec/controllers/articles_controller_spec.rb 
1) ArticlesController Admin not logged in should not load new article page
     Failure/Error: expect(response.code).to eq('401')

       expected: "401"
            got: "200"

Step 7

Change articles controller :

http_basic_authenticate_with name: 'user', password: 'secret', only: [:create, :edit, :update, :destroy, :new]

Step 8

Run all the tests. They pass.

Step 9

Add the test under admin logged in context:

    it 'should load new article page' do
      get :new

      expect(response.code).to eq('200')
    end

Step 10

Run the test. It passes without failing. It's ok, because of the change we made earlier.

Step 11

  it 'should not load show article page' do
    article = Article.create(title: 'test', description: 'test')

    get :show, { id: article.id }

    expect(assigns[:article]).to_not be_nil 
  end

The test passes.

Step 12

Comment out the

@article = Article.find(params[:id]) 

line in the show action. Run the test. It fails

1) ArticlesController should not load show article page
     Failure/Error: expect(assigns[:article]).to_not be_nil
       expected: not nil
            got: nil

So we make sure that it is failing for the right reason. Let's uncomment that line and run rake spec. Now we are back at 100% test coverage.

I spent about an hour trying to resolve the problems in the feature spec that was failing due to http basic authentication issues. Eventually I deleted the failing tests. This created gaps in our test coverage that we were able to see using the simplecov test coverage tool. We then wrote tests for the gaps to bring our test coverage back to 100%. Remember the Testing Pyramid we discussed in an earlier lesson, so we aim to follow the Testing Pyramid as much as possible while being practical during coding.

Summary


In this lesson you learned how to write a view test and how to use simplecov to keep test coverage at 100%.


Related Articles