2016-08-04 7 views
0

に割り当てる現在、私は私のコントローラで、次のカスタムアクションを持っている:RSpecの3 - テストは、コントローラのアクション

def set_active 
    current_user.active_meal_plan = @meal_plan 
    current_user.save 

    respond_with @meal_plan, location: -> { meal_plans_path } 
end 

ことが予想されるとして、コントローラのアクション作品。しかし、私は、Rspecを使ってcurrent_user.active_meal_plan = @meal_planの部分をテストする方法を少し失っています。すべてのテストは第二1以外渡す

RSpec.describe MealPlansController, type: :controller do 
    let(:user) { FactoryGirl.create(:user, :admin) } 

    before :each do 
    # Sign in with Devise as an admin user 
    @request.env["devise.mapping"] = Devise.mappings[:admin] 
    sign_in user 

    # Bypass CanCan's authorization 
    allow_any_instance_of(CanCan::ControllerResource).to  receive(:load_and_authorize_resource){ nil } 
    end 

    # ... 

    describe "PUT #set_active" do 
    let(:meal_plan) { FactoryGirl.create(:meal_plan, user: user) } 

    it "assigns the requested meal plan to @meal_plan" do 
     put :set_active, id: meal_plan 
     expect(assigns(:meal_plan)).to eq(meal_plan) 
    end 

    it "sets the requested meal plan as the user's active meal plan" do 
     put :set_active, id: meal_plan 
     expect(assigns(user.active_meal_plan)).to eq(meal_plan) 
    end 

    it "redirects to the meal plans view" do 
     put :set_active, id: meal_plan 
     expect(response).to redirect_to meal_plans_path 
    end 
    end 

これは次のように私のテストがどのように見えるかです。

class User < ActiveRecord::Base 
    # .. 
    has_many :meal_plans, dependent: :destroy 
    belongs_to :active_meal_plan, class_name: 'MealPlan' 
end 

そして、私のユーザーの工場:

FactoryGirl.define do 
    factory :user do 
     first_name 'John' 
     last_name 'Doe' 
     address 'San Francisco Bay Area' 
     email { Faker::Internet.email } 
     password "password" 
     password_confirmation "password" 
     pricing_plan { FactoryGirl.create(:pricing_plan) } 
     active_meal_plan nil 
    end 

    trait :user do 
     after(:create) {|user| user.add_role(:user)} 
    end 

    trait :admin do 
     after(:create) {|user| user.add_role(:admin)} 
    end 
end 

はまた、明らかにassignsが実際にRailsの5、controller tests will be removedに廃止される予定

は、ここに私のUserモデルです。議論によれば、私が集めるものから、私はそのようなことをテストすべきではないようです...。

とにかく、私はこのテストに合格したいと思います。

答えて

0

助手assignsは実際に@meal_planのようにivarをフェッチしますが、current_userはivarではなくメソッドです。

は、ここで私はそれをテストする方法をです:完全に

it "sets the requested meal plan as the user's active meal plan" do 
    put :set_active, id: meal_plan 
    expect(user.reload.active_meal_plan).to eq(meal_plan) 
end 
+0

作品!ありがとうございました! – Andres

関連する問題