2015-08-23 9 views
7

Im Anschluss mit Ben Walker (erstaunlich) Let's Build Instagram With Rails, speziell die BDD-Version. Tutorial verwendet FactoryGirl. Ich erhalte die folgende Fehlermeldung mit einer Reihe von Tests:Factory Girl/Rspec - "Trait Nicht Registriert" Fehler

Kurzfassung

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

Ich kann nicht Ben bekommen sogar den Fehler mit einem clone of my repo neu, und ich finde nichts die Stack Overflow- "Trait nicht registriert" -Fragen.

Dies ist meine erste SO-Frage, also, wenn ich etwas falsch mache auf , dass Front, lass es mich wissen. Vielen Dank im Voraus für die Hilfe!

-Code Auswahl:

spec/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 '[email protected]' 
    user_name 'Arnie' 
    password 'illbeback' 
    id 1 
    end 
end 

spec/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 

app/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 

app/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 

app/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 

Full Error (einer von vielen)

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)>' 

Antwort

3

Ändern Sie Ihre Fabriken, um die association zu verwenden.

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 '[email protected]' 
    user_name 'Arnie' 
    password 'illbeback' 
    sequence(:id) { |id| id } 
    end 
end 

Dann erstellen Sie den Benutzer und schreiben wie folgt aus:

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

Diese funktionieren sollte.

Weitere Informationen zu factory_girl associations.

+0

Danke, Sie haben mir geholfen, das Problem zu lösen. Seltsamerweise habe ich immer noch Fehler ('Fehler/Fehler: post = create (: post, Benutzer: Benutzer) NoMethodError: undefined Methode 'to_sym' für # ') es auf Ihre Weise zu tun, aber die Verbindung loszuwerden (da die Assoziation der gleiche Name wie die Fabrik ist, pro den Link, den Sie mir gaben), löste das Problem. Ich muss weiter graben, während es funktioniert, ich mag es nicht zu wissen, warum. ABER DANKE. –

+0

Ja, richtig. Wenn die Zuordnung denselben Namen wie die Factory hat, müssen Sie das Schlüsselwort 'association 'nicht verwenden. Aber ich dachte, das würde immer noch funktionieren und ich habe es dort benutzt, um dir zu zeigen, dass das die Assoziation ist. Aber ich habe es nicht getestet, bevor ich hier gepostet habe. Gut, dass du es gedacht hast :) +1 –

1

Ich habe genau diese Fehlermeldung auch, und es war wegen dieser Codezeilen in meiner Spec-Datei.

# .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 meiner App haben Benutzer viele Boards, und Boards haben viele Kategorien. In diesem Teil meiner Spezifikation habe ich versucht, einen Benutzer, eine Karte, die über die id-Eigenschaft mit diesem Benutzer verknüpft ist, und eine Liste von 5 Kategorien zu erstellen, die jeweils über die -Eigenschaft unter category mit dieser einen Karte verknüpft sind.

Das Problem war ich kopierte die Argumente für die create_list Funktion zum Erstellen categories und fügte sie als Argumente für die create Funktion zum Erstellen einer Platine.

Die Funktion create erwartet eine Eigenschaft überschreiben als zweites Argument, während die Funktion create_list eine Ganzzahl erwartet, die angibt, wie viele Objekte die Liste füllen soll.

ist der Fehler, weil das zweite Argument von 1 in der für ein einzelnes category bestimmt create Funktion, gezeigt, eine Überschreibung ‚Eigenschaft darstellt, denn das ist, was die create Funktion als zweites Argument erwartet. Durch Entfernen der 1 als zweiten Parameter in create ist der Fehler verschwunden, da die richtigen Parameter bereitgestellt werden.

Prost.

Verwandte Themen