2016-08-04 25 views
0

Zur Zeit habe ich die folgende benutzerdefinierte Aktion in meinem Controller:Rspec 3 - Prüfung zuweisen in Controller-Aktion

def set_active 
    current_user.active_meal_plan = @meal_plan 
    current_user.save 

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

Der Regler funktioniert, wie es erwartet wird. Ich bin jedoch ein wenig ratlos, wie man den current_user.active_meal_plan = @meal_plan Teil mit Rspec testet. Diese

ist, wie mein Test wie folgt aussieht:

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 

Alle Tests bestanden mit Ausnahme der zweiten ein.

Hier ist mein User-Modell:

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

Und mein Benutzer Fabrik:

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 

Außerdem offenbar assigns wird 5. Eigentlich controller tests will be removed, in Rails veraltet. Von dem, was ich erfasse, scheint es laut der Diskussion, dass ich solche Dinge nicht testen sollte ...

Wie auch immer, ich möchte diesen Test bestanden haben.

Antwort

0

Der Helfer assigns wird tatsächlich den ivar holen, wie @meal_plan, aber current_user ist kein ivar, sondern eine Methode.

Hier ist, wie ich es prüfen würde:

perfekt
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

Works! Vielen Dank! – Andres