spec(3) - controller

2679 ワード

テストされていないコードはごろつきです
  • rspec(1) - summary
  • specs(2) - model
  • specs(3) - controller
  • specs(4) - request
  • specs(5) - mock
  • [specs(6) - mailer]
  • [specs(7) - view]
  • [specs(8) - routing]
  • [specs(9) - helper]
  • [specs(10) - factory-girl]
  • [specs(11) - fake other gems]
  • [specs(12) - sidekiq]
  • [specs(13) - db migration]
  • [specs(14) - timecop]
  • [specs(15) - jenkins]

  • 前述したUserを例にrailsにおけるcontrollerのテストについて説明する.UserControllerのテストの生成
    rails generate rspec:controller user
    create  spec/controllers/user_controller_spec.rb
    

    indexのテストの追加
    require "rails_helper"
    
    RSpec.describe UserController, :type => :controller do
      describe "GET #index" do
        it "responds successfully with an HTTP 200 status code" do
          get :index
          expect(response).to be_success
          expect(response).to have_http_status(200)
        end
    
        it "renders the index template" do
          get :index
          expect(response).to render_template("index")
        end
    
        it "loads all of the User into @users" do
          user1, user2 = User.create!, User.create!
          get :index
    
          expect(assigns(:users)).to match_array([user1, user2])
        end
      end
    
      describe "GET #new" do
          it "responds successfully with HTTP 200 status code"
              get :new
              expect(response).to be_success
              expect(response).to have_http_status(200)
          end
    
          it "renders the new template" do
              get :new
              expect(response).to render_template("new") 
          end
      end
    
      describe "POST #create" do
         it "create a user" do
            lambda do
              post :create, {user : { name: "zql" } }
            end.should change(User, :count).by(1)
            expect {
              post :create, {user: {name: "zql"} }
            }.to change(User, :count).by(1)
         end
      end
    
      describe "PUT #update" do
         before do
             @user = User.create
         end
    
         it "update a user" do
            lambda do
              put :update, {user: {name: "zql"} }
            end.should change(User, :count).by(0)
            @user.reload.name.should eq "zql"
         end
      end
    
       descible "DELETE #destroy" do
         before do
             @user = User.create
         end
    
         it "destroy a object" do
            lambda do
              delete :destroy, {id: @user.id}
            end.should change(User, :count).by(-1)
            @user.reload.id.should be_nil
         end
       end
    
    end