2013-06-26 15 views
24

Chcę przetestować model z RSpec, ale prawdopodobnie natknąłem się na literówkę, której nie mogę znaleźć. Czy ktoś może mi trochę pomóc? Długo się z tym zmagałem i po prostu nie mogę znaleźć żadnych błędów. Z góry dziękuję!Fabryka niezarejestrowana

user_spec.rb

require 'spec_helper' 

describe User do 
    it "has a valid factory" do 
     FactoryGirl.build(:user).should be_valid 
    end 
    it "is invalid without an e-mail" 
    it "is invalid without a correct e-mail" 
    it "is invalid without a password" 
    it "is invalid without a matching password confrimation" 
end 

user.rb

FactoryGirl.define do 
    factory :user do |f| 
     f.email "[email protected]" 
     f.password "ruby" 
     f.password_confrimation "ruby" 
    end 
end 

spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'rspec/autorun' 
require 'factory_girl' 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 

RSpec.configure do |config| 
    # ## Mock Framework 
    # 
    # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: 
    # 
    # config.mock_with :mocha 
    # config.mock_with :flexmock 
    # config.mock_with :rr 

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    # If you're not using ActiveRecord, or you'd prefer not to run each of your 
    # examples within a transaction, remove the following line or assign false 
    # instead of true. 
    config.use_transactional_fixtures = true 

    # If true, the base class of anonymous controllers will be inferred 
    # automatically. This will be the default behavior in future versions of 
    # rspec-rails. 
    config.infer_base_class_for_anonymous_controllers = false 

    # Run specs in random order to surface order dependencies. If you find an 
    # order dependency and want to debug it, you can fix the order by providing 
    # the seed, which is printed after each run. 
    #  --seed 1234 
    config.order = "random" 
end 

błąd

Factory not registered: user 
+1

Sprawdź http://stackoverflow.com/questions/4303329/rspec-cant-find-factorys-from-factorygirl. Myślę, że potrzebujesz klejnotu factory_girl_rails. –

+0

Już to mam. lista klejnotów | grep rspec * wyjście to rspec-rails (2.13.2) – Kert

+0

factory_girl_rails różni się od rspec_rails –

Odpowiedz

30

Masz fabryczną definicję w niewłaściwym pliku, zgodnie z twoim pytaniem znajduje się w user.rb. To musi być w factories.rb w folderze testowym (SPEC) Jeśli używasz rspec

# user.rb 

FactoryGirl.define do 
    factory :user do |f| 
     f.email "[email protected]" 
     f.password "ruby" 
     f.password_confrimation "ruby" 
    end 
end 

Zmień powyżej temu (Również nie trzeba zmiennej f)

# spec/factories.rb 

FactoryGirl.define do 
    factory :user do 
     email "[email protected]" 
     password "ruby" 
     password_confrimation "ruby" 
    end 
end 

także komentarze powiedzieć, upewnij gem 'factory_girl_rails' jest w swojej Gemfile, zamiast tylko gem 'factory_girl'

+0

Najwyraźniej nie miałem racji co do nazwy fabryki.rb, przynajmniej w oparciu o test, który właśnie zrobiłem. Jeśli wprowadzisz niewielką zmianę do swojej odpowiedzi, usunę moje argumenty. Przepraszam za to. Mógłbym przysiąc ... –

+4

Definicja może wejść w 'spec/factory/user.rb' i działać poprawnie. Ten plik 'spec/factories.rb' może z czasem zostać naprawdę nadęty, jeśli nie będzie można podzielić definicji fabrycznych. –

+0

@PaulFioravanti Zgoda. Dla uproszczenia, ponieważ nie było wskazania "użytkownik".rb' było gdzieś w pobliżu folderu 'spec', po prostu zasugerowałem' factories.rb', ponieważ myślałem, że będzie to najłatwiejsze do zrozumienia. – fontno

0

I uciekł do następującego problemu ze strukturą folderów w swoich fabrykach/ - factories/ -- artists.rb -- techniques.rb

artists.rb

FactoryBot.define do 
    factory :artist do 
     name  'Michael' 
     technique FactoryBot.create :technique 
    end 
    end 

techniques.rb

FactoryBot.define do 
    factory :technique do 
    name 'Some name' 
    end 
end 

Tak było przed załadowaniem artystę technika obiektu zostały załadowane. Więc nie mógł go znaleźć. Rozwiązaniem jest nie używanie zagnieżdżonego tworzenia FactoryBot w fabrykach ani zmiana nazwy swoich zagnieżdżonych fabryk na coś, co stoi przed fabryką macierzystą.

Właśnie przeniosłem swoją fabrykę techniki. do factories.rb i zdefiniował tam. Problem został rozwiązany.

Powiązane problemy