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.
Works! Vielen Dank! – Andres