2014-04-20 231 views
1

我最近正在研究一些rspec測試,我想知道如何正確測試控制器。我的控制是相當簡單,所以它不應該是太辛苦:簡單的控制器測試rspec rails4

class UsersController < ApplicationController 
before_action :set_user, only: [:show, :edit, :update, :destroy] 

# GET /users 
def index 
@q = User.search(params[:q]) 
@users = @q.result(distinct: true) 
@q.build_condition if @q.conditions.empty? 
@q.build_sort if @q.sorts.empty? 
end 

# GET /users/1 
def show 
end 

# GET /users/new 
def new 
@user = User.new 
end 

# GET /users/1/edit 
def edit 
end 

def archive 
@q = User.search(params[:q]) 
@users = @q.result(distinct: true) 
@q.build_condition if @q.conditions.empty? 
@q.build_sort if @q.sorts.empty? 
end 

# POST /users 
def create 
@user = User.new(user_params) 
if @user.save 
redirect_to users_path, notice: 'Student was successfully added.' 
else 
render action: 'new' 
end 
end 

# PATCH/PUT /users/1 
def update 
if @user.update(user_params) 
redirect_to @user, notice: 'Student information was successfully updated.' 
else 
render action: 'edit' 
end 
end 

# DELETE /users/1 
def destroy 
@user.destroy 
redirect_to users_url, notice: 'Student information was successfully deleted.' 
end 

private 
# Use callbacks to share common setup or constraints between actions. 
def set_user 
@user = User.find(params[:id]) 
end 

# Only allow a trusted parameter "white list" through. 
def user_params 

params.require(:user).permit(:firstName, :lastName, :email, :dateOfBirth, :notes, :sex, :archive, :category => []) 

end 
end 

到目前爲止,我已經寫了2-3測試,但我不知道如果他們甚至做任何事情:

describe 'GET #index' do 
it "displays all users" do 
    get :index 
response.should be_redirect 
end 
end 

describe 'GET #new' do 
it "creates a new user" do 
    get :new 
response.should be_redirect 
end 
end 

我嘗試做同樣的編輯和顯示,但他們沒有工作,我不知道爲什麼(因爲如我所說,我不知道我在做什麼)。 任何人都可以給我一些這些方法的測試例子,或者可以將我重定向到rails4的rspec指南?

回答

3

你期待控制器#INDEX動作重定向?因爲那不會是典型的。 我會

describe 'GET #index' do 
    get 'index' 
    it {expect(response).to be_success)} 
end 

這條線......

it "displays all users" do 

在控制器的規格使我懷疑你的混亂控制器和要求的規格。當我第一次運行測試時,我做到了這一點。 「顯示所有用戶」聽起來像是一個請求規範。測試頁面重定向或響應狀態代碼更類似於控制器規格。

我發現http://betterspecs.org/對於理解測試更有幫助。

回覆:測試

這爲我工作,但結果可能會有所不同。

控制器規格 - 不要測試控制器

控制器應該是瘦,所以你只是測試是否Rails的工作。例如一個索引操作可能包含@users = User.all或類似的,而其他很少。那裏有什麼測試?沒有。如果你的控制器動作中有很多代碼,那麼它可能不應該在那裏。將它移出模型。記住:胖模型,瘦身控制器。這是測試如何創建更好的代碼的一個例子。我有很少的控制器規格,我認爲幾乎所有這些都是雙重檢查授權頁面。我只在控制器中有代碼的地方使用它們。這裏有一個例子:

context "Non admin signed in" do 
before(:each) do 
    sign_in user 
    controller.stub!(:current_user).and_return(user) 
end 

it {subject.current_user.should_not be_nil} 
it "deny non admin access to index" do 
    sign_in user 
    get 'index' 
    expect(response).to render_template("pages/access_denied") 
end 

請求規格測試,你會在瀏覽器中測試什麼(測試20%)

想象一下,你是不是做RSpec的測試。如果你像我一樣,那麼這不難想象。你會如何測試你想要構建的東西?有可能你要做的第一件事就是加載一個瀏覽器,看看你所期望的頁面是否有內容。 IS請求規格。就這麼簡單。請求規範是加載瀏覽器的自動方式,點擊幾個按鈕並檢查發生了什麼。無論你在瀏覽器中檢查什麼......使用Capybara檢查相同的東西。如果它在頁面上有Javascript,那麼你需要在Capybara之上使用Webkit或Selenium來按照你的意願推動按鈕。有了硒,你實際上可以看到瀏覽器窗口在桌面上彈出,就好像一個神祕的gremlin已經控制了你的鍵盤。不要在請求規範中測試任何不會在瀏覽器中手動測試的任何內容。這意味着不要檢查數據庫中其他模型的狀態。請求規格是用戶可以看到的。如果你看不到它,請不要測試它。

型號規格 - 測試你會在控制檯測試(測試80%) 在我成爲一個很好的TDD/BDD的男孩,我發現我花了很多時間裝載了IRB或控制檯和製作模型和做X來看Y是否會發生。自動化那件事。這是一個模型規範。當你的請求規範失敗時(它首先應該是有用的),然後下載到模型規範中。一個失敗的要求規範可能是:

it {expect(page.find('#login_box')).to have_content 'Logged in as Kevin Monk'} 

no method full_name for instance of User 

如果你不是一個TDD好孩子,你可能加載了控制檯和查找與該FULL_NAME方法發生。

> rails console 
$> kevin = User.find(1) 
$> kevin.full_name 

然後目測檢查你是否得到全名,但這應該作爲模型規範來完成。

我希望有幫助。我在很多關於測試的書中遇到了一個問題,那就是作者傾向於成爲這樣的專家,因此並不理解我們凡人真的需要了解它應該測試的基本前提。

+0

那麼問題是,我不知道我需要使用rspec進行測試。我可以考慮使用截圖等進行很多測試,但是當涉及到rspec時,我只是不知道該怎麼做(因爲這是我第一次)。我會給betterspecs.org一看,但謝謝!:) – Meldanen

+0

我感覺你的痛苦。我的情況完全相同。我會用這方面的一些指導來更新我的答案。 –

+0

@Kevin Monk你能告訴我如何測試我的控制器編輯方法,我的編輯方法看起來像是'def edit @school = School.find(params [:id])end'。我已經看到,這個特定的功能不覆蓋在我的報道文件中。所以,如果你可以,那麼請幫助我。 –

0

你在你的代碼規範一個錯字,你必須輸入反應變更爲響應

我覺得that's

您可以在

找到關於測試控制器的更多信息問題https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs

問候

+0

哦,那是我在這裏重寫時的一個錯字。這兩個測試在我的代碼中正確寫入^^謝謝你指出它,我現在編輯OP。 你還推薦什麼其他測試用於控制器?我通常能夠編寫很多測試,但由於這是我的第一個rails應用程序,所以我遇到了一些麻煩。 – Meldanen

+0

嗨,您應該將錯誤粘貼到現在更好的情況下,還應該查看railscast中的rspec截屏並檢查betterpsecs.org準則。 – Michelson