Factory Girl / Rspec - "Not Registered" Error

Following along with Ben Walker (surprisingly) Let Build Instagram With Rails , specifically the BDD version. The tutorial uses FactoryGirl. I get the following error on a series of tests:

Short version

Failure/Error: post = create( :post, user_id = user.id )<br> ArgumentError:<br> Trait not registered: 1 

I can’t get Ben to even recreate the error with the clone of my repo , and I don’t find anything in the overflow of the stack to “not register” issues.

This is my first SO question, so if I am doing something wrong on this front, please let me know. Thank you in advance!

Code Selection:

specifications /factories.rb

 FactoryGirl.define do factory :post do caption "nofilter" image Rack::Test::UploadedFile.new(Rails.root + 'spec/files/images/coffee.jpg', 'image/jpg') user_id 1 end factory :user do email ' fancyfrank@gmail.com ' user_name 'Arnie' password 'illbeback' id 1 end end 

specifications / features / viewing_posts_spec.rb

 require 'spec_helper' feature 'viewing individual posts' do background do user = create :user post = create( :post, user_id = user.id ) sign_in_with user end scenario 'can click and view a post' do post = create(:post) visit '/' find(:xpath, "//a[contains(@href,'posts/2')]").click expect(page.current_path).to eq(post_path(post)) end end 

application / models / post.rb

 class Post < ActiveRecord::Base belongs_to :user validates :user_id, presence: true validates :image, presence: true has_attached_file :image, styles: { :medium => "640x" } validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ end 

application / models / user.rb

 class User < ActiveRecord::Base validates :user_name, presence: true, length: { minimum: 4, maximum: 16 } # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_many :posts, dependent: :destroy end 

application / controllers / posts_controller.rb

 class PostsController < ApplicationController before_action :authenticate_user! def index @posts = Post.all end def new @post = current_user.posts.build end def create @post = current_user.posts.build(post_params) if @post.save flash[:success] = 'Your post has been created.' redirect_to posts_path else flash[:alert] = 'Halt, you fiend! You need an image to post here!' render :new end end def show @post = Post.find(params[:id]) end def edit @post = Post.find(params[:id]) end def update @post = Post.find(params[:id]) if @post.update(post_params) flash[:success] = 'Post updated hombre.' redirect_to root_path else flash[:alert] = 'Something is wrong with your form!' redirect_to root_path end end def destroy @post = Post.find(params[:id]) @post.destroy flash[:success] = 'Problem solved! Post deleted.' redirect_to root_path end private def post_params params.require(:post).permit(:caption, :image) end end 

Complete mistake (one of many)

 viewing individual posts can click and view a post Failure/Error: post = create( :post, user_id = user.id ) ArgumentError: Trait not registered: 1 # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/registry.rb:24:in `find' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/decorator.rb:10:in `method_missing' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl.rb:98:in `trait_by_name' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:113:in `trait_by_name' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:109:in `block in additional_traits' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:109:in `map' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:109:in `additional_traits' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:135:in `block in aggregate_from_traits_and_self' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:128:in `tap' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:128:in `aggregate_from_traits_and_self' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition.rb:33:in `to_create' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/definition_hierarchy.rb:16:in `build_from_definition' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/factory.rb:124:in `build_hierarchy' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/factory.rb:87:in `compile' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/factory.rb:32:in `run' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/factory_runner.rb:23:in `block in run' # /var/lib/gems/2.1.0/gems/activesupport-4.2.0/lib/active_support/notifications.rb:166:in `instrument' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/factory_runner.rb:22:in `run' # /var/lib/gems/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/strategy_syntax_method_registrar.rb:20:in `block in define_singular_strategy_method' # ./spec/features/viewing_posts_spec.rb:6:in `block (2 levels) in <top (required)>' 
+7
ruby ruby-on-rails rspec factory-bot
source share
2 answers

Change your factories to use association .

 FactoryGirl.define do factory :post do caption "nofilter" image Rack::Test::UploadedFile.new(Rails.root + 'spec/files/images/coffee.jpg', 'image/jpg') association user end factory :user do email ' fancyfrank@gmail.com ' user_name 'Arnie' password 'illbeback' sequence(:id) { |id| id } end end 

Then create a user and write like this:

 user = create :user post = create(:post, user: user) 

That should work.

Read more about factory_girl association .

+3
source share

I got this same error message, and it was because of these lines of code in my spec file.

 # .spec file let!(:user) { create(:user) } let!(:board) { create(:board, 1, user_id: user.id) } let!(:categories) { create_list(:category, 5, board_id: board.id) } 

In my application, users have many boards, and there are many categories on the boards. In this part of my specification, I tried to create one user, one board associated with this user using the id property, and a list of 5 categories, each of which is connected to one board through the id property in category .

The problem was that I copied the arguments to the create_list function to create the categories and pasted it as arguments to the create function designed to create one board.

The create function expects a property override as the second argument, while the create_list function expects an integer representing how many objects populate the list.

The error is shown because the second argument 1 in the create function, intended for a single category , is an override of the property, because this is what the create function expects as the second argument. By deleting 1 as the second parameter in create , the error will disappear because the correct parameters are specified.

Greetings.

+1
source share

All Articles