2015-08-23 16 views
7

Następujący razem z Benem Walkerem (zdumiewającym) Let's Build Instagram With Rails, w szczególności z wersją BDD. Tutorial używa FactoryGirl. Dostaję następujący błąd z szeregu testów:Factory Girl/Rspec - Błąd "Trait Not Registered"

wersja skrócona

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

nie mogę dostać Bena nawet odtworzyć błąd z clone of my repo, a ja nic w znalezieniu pytania "Brak cech rejestrowanych" w Stack Overflow.

To jest moje pierwsze pytanie na SO, więc jeśli robię coś złego na , że z przodu, proszę dać mi znać. Z góry dziękuję za pomoc!

pozycje Kod:

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/funkcje/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 (jeden z wielu)

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

Odpowiedz

3

Zmodyfikuj fabryki, aby korzystać z 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 '[email protected]' 
    user_name 'Arnie' 
    password 'illbeback' 
    sequence(:id) { |id| id } 
    end 
end 

Następnie należy utworzyć użytkownika i pisać tak:

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

to powinno działać.

Zobacz więcej o factory_girl associations.

+0

Dzięki, pomogłeś mi rozwiązać problem. Dziwne, wciąż mam błędy ("Błąd/błąd: post = utwórz (: post, użytkownik: użytkownik) NoMethodError: niezdefiniowana metoda" to_sym "dla # ') robiąc to po swojemu, ale pozbycie się związku (ponieważ skojarzenie jest takie samo jak w fabryce, za link, który mi dałeś) rozwiązało problem. Będę musiał się w to zagłębić, tak jak podczas pracy, nie podoba mi się, dlaczego. ALE DZIĘKUJĘ. –

+0

Tak, racja. Jeśli powiązanie ma taką samą nazwę jak fabryka, nie trzeba używać słowa kluczowego "associaiton". Ale myślałem, że to jeszcze zadziała i użyłem go tam, aby pokazać, że to jest związek. Ale nie przetestowałem go przed opublikowaniem tutaj. Dobrze, że to wymyśliłeś :) +1 –

1

Otrzymałem dokładnie ten sam komunikat o błędzie i to z powodu tych linii kodu w moim pliku specyfikacji.

# .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) } 

W mojej aplikacji użytkownicy mają wiele tablic, a tablice mają wiele kategorii. W tej części specyfikacji starałem się utworzyć jednego użytkownika, jedną tablicę, powiązaną z tym użytkownikiem za pośrednictwem właściwości id oraz listę 5 kategorii, z których każda jest połączona z tą jedną tablicą za pomocą właściwości id pod adresem category.

Problem polegał na tym, że skopiowałem argumenty dla funkcji create_list do tworzenia categories i wkleiłem je jako argumenty dla funkcji create, która ma na celu utworzenie jednej planszy.

Funkcja create oczekuje zastąpienia właściwości jako drugiego argumentu, natomiast funkcja create_list oczekuje liczby całkowitej, reprezentującej ile obiektów ma zostać wypełnionych.

Błąd jest pokazany, ponieważ drugi argument 1 w funkcji create, przeznaczone dla pojedynczego category, reprezentuje „nadpisanie właściwości, gdyż to właśnie funkcja create spodziewa się jako drugi argument. Po usunięciu 1 jako drugiego parametru w create, błąd zniknął, ponieważ podano prawidłowe parametry.

Pozdrawiam.

Powiązane problemy