2014-03-13 77 views
0

我對測試比較陌生,對Rails 4和rSpec也很新。我試圖測試一個使用Devise進行身份驗證的控制器,並且我被卡住了。我能找到的所有例子都是針對Rails 3.我使用的是Rails 4.0.3,Devise 3.2.3,rSpec 2.14.1和FactoryGirl 4.4.0。新手入門4測試 - 需要幫助入門(rSpec和設計)

class LessonPlansController < ApplicationController 
    before_action :authenticate_user! 

    # GET /lesson_plans 
    def index 
    @lesson_plans = current_user.lesson_plans.to_a 
    end 

    . 
    . 
    . 

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

    # Only allow a trusted parameter "white list" through. 
    def lesson_plan_params 
    params[:lesson_plan] 
    end 

    def lesson_plan_params 
    params.require(:lesson_plan).permit(:title, :synopsis) 
    end 
end 

這裏是我廠的定義:(也許我不需要在lesson_plan工廠來定義USER_ID?)

FactoryGirl.define do 
    factory :user do 
    sequence(:username) { |n| "user#{n}" } 
    sequence(:email)  { |n| "foo#{n}@example.com" } 
    password    'foobarbaz' 
    password_confirmation 'foobarbaz' 
    created_at    Time.now 
    updated_at    Time.now 
    end 
end 

FactoryGirl.define do 
    factory :lesson_plan do 
    user_id 1 
    title "The French Revolution" 
    synopsis "Background and events leading up to the French Revolution" 
    end 
end 

與被測試部分是我卡住。

describe LessonPlansController do 
    let(:valid_attributes) { { } } 
    let(:valid_session) { {} } 

    # describe "GET index" do 
    it "assigns all lesson_plans as @lesson_plans" do 
    user=FactoryGirl.create(:user) 
    sign_in user 
    lesson_plan = LessonPlan.create! valid_attributes 
    get :index, {}, valid_session 
    assigns(:lesson_plans).should eq([lesson_plan]) 
    end 
end 

我不知道該把什麼放在valid_attributes和valid_session(或者如果我甚至需要它們)。測試將盡可能地登錄用戶,但會在創建lesson_plan時失敗。無可否認,這是rSpec的默認/生成測試,但我不確定如何繼續。

示例我已經看到使用before塊來設置用戶。我一直無法在Devise wiki頁面上找到任何內容,涵蓋如何爲需要用戶登錄的控制器編寫基本的rSpec測試。任何指針都將不勝感激!

+0

該規範可能會失敗,因爲您正在創建一個沒有任何屬性的課程計劃。 – 2014-03-13 00:47:21

+0

這很有道理。我會仔細看看。 – jbmoon

回答

0

"I'm not sure what to put in valid_attributes and valid_session (or if I even need them)."

嗯,這取決於你正在測試什麼..說你正在測試&要確保,如果x列設置爲空的記錄不會被創建的驗證......那麼你可以嘗試專門創建一個具有無效屬性的記錄(例如column: nil),並期望結果不會返回true;也許你想確保它是用有效屬性創建的。

因爲您使用的是FactoryGirl,所以您可以使用`attributes_for(:factory_name)``。並且,您不一定需要在課程計劃工廠中指定用戶的ID;除非你總是希望它引用用戶1.你可以簡單地引用用戶沒有價值。查看http://everydayrails.com/2012/03/12/testing-series-intro.html,特別是第3-5部分,介紹如何使用RSPec進行測試。當我開始使用時,我發現這很容易遵循指南。

+0

我有一個測試(即通過)爲lesson_plan模型。我會嘗試使用'attributes_for(:lesson_plan)',但是我想知道如何通過爲當前用戶創建課程計劃,因爲這是我的控制器創建課程計劃的方式:'@lesson_plan = current_user.lesson_plans。新(lesson_plan_params)' – jbmoon

+0

我用rSpec購買了這本書Everyday Testing。我主要是在設計部分掛了。 Everyday系列非常有幫助。 – jbmoon

+0

另外..我建議添加'config.include FactoryGirl :: Syntax :: Methods'到你的規範助手。這允許你調用'create()','build()'等等。沒有'FactoryGirl'前綴 – 2014-03-13 02:00:36