2016-08-04 2 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 

Действие контроллера работает как ожидается. Тем не менее, я немного не понимаю, как протестировать часть current_user.active_meal_plan = @meal_plan с использованием Rspec.

Это как мой тест выглядит следующим образом:

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 

Все тесты проходят за исключением 2-го.

Вот моя модель Пользователь:

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. Из того, что я собираю, в соответствии с обсуждением, кажется, что я не должен тестировать такие вещи.

В любом случае, я хотел бы пройти этот тест.

ответ

0

Помощник assigns на самом деле возьмет ivar, например @meal_plan, но 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

Смежные вопросы