0

Я создаю приложение Rails (4.1.8) с Postgres (0.18.3), Rspec (3.1.0) и FactoryGirl (4.5.0). Мне нужна помощь в поиске и устранении неполадок с тестом контроллера, который вызывает ошибку Active Record :: AssociationTypeMismatch, вызванную объектом FactoryGirl.Ошибка контроллера Rails 4 - ActiveRecord :: AssociationTypeMismatch?

Вот мой Фитнес цели индекс действия контроллера:

def index 
    @fitness_goals = @member.fitness_goals.order(:start_date)  
end 

Это моя установка и проверка действия индекса фитнес-целей управления (fitness_goals_controller_spec.rb):

RSpec.describe FitnessGoalsController, :type => :controller do 

let(:member_attributes) { { 

    "first_name" => 'Joe', 
    "last_name" => 'Smith', 
    "sex" => 'Male', 
    "age" => 30, 
    "height" => 69, 
    "weight" => 187, 
    "goal" => ["Lose Fat"], 
    "start_date" => Date.current  
    } 
} 

before :each do 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    @user = FactoryGirl.create(:user) 
    sign_in @user 

    @member = @user.build_member member_attributes 
    @member.save 

    @fitness_goal = FactoryGirl.create(:fitness_goal, member: @member) 
    @fitness_goal_attributes = FactoryGirl.build(:fitness_goal).attributes 
    @fitness_goal_invalid_attributes = FactoryGirl.build(:fitness_goal, timeframe_id: nil).attributes 
    @fitness_goal_update_attributes = FactoryGirl.build(:fitness_goal).attributes 
    @fitness_goal_update_invalid_attributes = FactoryGirl.build(:fitness_goal, timeframe_id: nil).attributes 
end 

describe "GET index" do 
    it "assigns all fitness goals as @member.fitness_goals" do 
    get :index, { :member_id => @member } 
    expect(assigns(:fitness_goals)).to eq(@member.reload.fitness_goals) 
    end 
end 

RSpec ошибка и обратная линия:

1) FitnessGoalsController GET index assigns all fitness goals as @member.fitness_goals 
Failure/Error: @fitness_goal = FactoryGirl.create(:fitness_goal, member: @member) 
ActiveRecord::AssociationTypeMismatch: 
    Target(#62887900) expected, got String(#8489780) 
# .rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/associations/association.rb:216:in `raise_on_type_mismatch!' 
# .rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/associations/collection_association.rb:356:in `block in replace' 
# .rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/associations/collection_association.rb:356:in `each' 
# .rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/associations/collection_association.rb:356:in `replace' 
# .rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/associations/collection_association.rb:41:in `writer' 
# .rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/associations/builder/association.rb:118:in `targets=' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:16:in `public_send' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:16:in `block (2 levels) in object' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:15:in `each' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:15:in `block in object' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:14:in `tap' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:14:in `object' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/evaluation.rb:12:in `object' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/strategy/create.rb:9:in `result' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/factory.rb:42:in `run' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/factory_runner.rb:23:in `block in run' 
# .rvm/gems/ruby-2.1.5/gems/activesupport-4.1.8/lib/active_support/notifications.rb:161:in `instrument' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/factory_runner.rb:22:in `run' 
# .rvm/gems/ruby-2.1.5/gems/factory_girl-4.5.0/lib/factory_girl/strategy_syntax_method_registrar.rb:20:in `block in define_singular_strategy_method' 
# ./spec/controllers/fitness_goals_controller_spec.rb:44:in `block (2 levels) in <top (required)>' 

Ошибка ссылается на целевую модель, has_and_ belongs_to_many (HABTM) ассоциация с моделью Фитнес Цель: Target (# 62887900) ожидается, получил Струнный (# 8489780)

Соответствующие модели:

class FitnessGoal < ActiveRecord::Base 
    has_and_belongs_to_many :targets 
end 

class Target < ActiveRecord::Base 
    has_and_belongs_to_many :fitness_goals 
end 

Соединить таблицы в схеме:

create_table "fitness_goals_targets", id: false, force: true do |t| 
    t.integer "fitness_goal_id" 
    t.integer "target_id" 

конец

Фитнес цель Титулы:

def fitness_goal_params 
    params.require(:fitness_goal).permit(:goal_list_id, :timeframe_id, :start_date, :end_date, { target_ids: [] }, { activity_ids: [] }, :notes, :member_id, :trainer_id) 
end 

Фитнес Цель завода:

FactoryGirl.define do 
    factory :fitness_goal do 
association :goal_list 
association :timeframe 
start_date Date.current 
end_date Date.current + 30    
targets ["Lose Fat", "Reduce caloric intake by x%"] 
activities ["Walk x steps a day", "Climb x floors a day", "Run x miles a day"]  
association :member 
association :trainer 
notes 'This is a sample note.' 
    end 
end 

Что я делаю неправильно? Код приложения работает как в среде разработки, так и в производственной среде. Похоже, что проблема заключается в моей настройке для объекта FactoryGirl. Внедрение ассоциации HABTM - это то, что нарушило тест контроллера. Как исправить проблему и повторить проверку контроллера? Спасибо за любую помощь!

ответ

0

Вам необходимо сменить завод, чтобы передавать объекты Target, а не строки в эту ассоциацию. Поэтому вам нужно создать объекты Target (или найти их, если они уже существуют). Изменение

targets ["Lose Fat", "Reduce caloric intake by x%"] 

в

targets { [create(:target, field: "Lose Fat"), create(:target, field: "Reduce caloric intake by x%")] } 

Ярлык я использовал «поле», потому что я не уверен, что это поле называется, так просто использовать его имя вместо.

+0

Это изменение решило проблему! Спасибо. – codeinspired

+0

Рад, что я мог бы помочь! – odaata

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