Подтвердить что ты не робот

FactoryGirl: Factory не зарегистрировано

Я работаю над проектом со структурой вроде:

projects/warehouse/core
projects/warehouse/products/bottles
projects/warehouse/products/boxes

В этом проекте логика приложения, драгоценные камни и т.д. находятся в приложении core. У меня есть boxes для rspec, например:

projects/warehouse/products/boxes/spec
    /factories
    /models

Каталог factories содержит cubics.rb:

FactoryGirl.define do
  factory :cubic
    id 1
    dimension 12
  end
end

Каталог models содержит cubic_spec.rb:

require 'spec_helper'

describe Boxes::Cubic do
  it "has a valid factory" do
    FactoryGirl.create(:cubic).should be_valid
  end
end

Модель Cubic находится в products/boxes/app/models/boxes/cubic.rb.

module Boxes
  class Cubic < BoxExBase
    self.table_name = 'containers'
    #validation stuff goes here
  end
end

Простой и понятный. Когда я выполняю rspec ../products/boxes/spec/models/cubic_spec.rb, я получаю ArgumentError: Factory не зарегистрировано: куб. Я пробовал, требуя factory_girl_rails в spec_helper.rb. Я пробовал модифицировать spec_helper.rb w/

FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
FactoryGirl.find_definitions

gemfile в core содержит gem 'factory_girl_rails' в тестовых группах разработки. Я даже попытался получить Factory, чтобы вызвать ошибку, но этого даже не происходит. Поэтому Factory, похоже, даже не загружается. Что мне нужно сделать, чтобы загрузить этот Factory и зарегистрировать?

4b9b3361

Ответ 1

Вам нужно помочь фиктивному приложению (или консоли rails), так как FactoryGirl будет выглядеть в Rails.root, который является spec/dummy.

Итак, из консоли, запущенной в spec/dummy, например, просто выполните следующее:

FactoryGirl.definition_file_paths = %w(../factories)
FactoryGirl.find_definitions
# You can use this line to see what factories are loaded
# FactoryGirl.factories

В вашем конкретном случае вам нужно будет изменить фактические местоположения, но где вы находитесь, если FactoryGirl не находит ваши заводы, потому что он не знает, где искать.

Чтобы быть конкретным: вот что я сделал. Мои потребности были следующими: мне нужно было запустить rspec из корневого каталога Gem. Но мне также нужно иметь возможность запускать консоль рельсов из встроенного фиктивного проекта и доступ к девушке Factory для создания удобного тестового объекта во время разработки.

TL;DR Добавьте этот код в свое фиктивное приложение application.rb

 console do
   FactoryGirl.definition_file_paths << Pathname.new("../factories")
   FactoryGirl.definition_file_paths.uniq!
   FactoryGirl.find_definitions
 end

├── spec
│   ├── dummy
│   │   ├── app
│   │   ├── bin
│   │   ├── config
│   │   │   ├── environments
│   │   │   ├── initializers
│   │   │   ├── locales
│   │   │   ├── application.rb << This is the file to add the lines in.

Выпущенные биты моего макета приложения выглядят как

├── app
├── bin
├── config
├── lib
├── spec
│   ├── dummy
│   │   ├── app
│   │   ├── bin
│   │   ├── config
│   │   │   ├── environments
│   │   │   ├── initializers
│   │   │   ├── locales
│   │   │   ├── application.rb
│   │   │   ├── boot.rb
│   │   │   ├── database.yml
│   │   │   ├── environment.rb
│   │   │   └── routes.rb
...
│   ├── factories
│   │   └── models
│   │       └── api_requests.rb
│   ├── lib
│   │   ├── controllers
│   │   │   ├── controller_spec.rb
│   │   │   └── session__spec.rb
│   │   └── my_spec.rb
│   ├── support
│   └── vcr
│   ├── spec_helper.rb

├── Gemfile
├── Gemfile.lock
├── mygem.gemspec  << this is the file to include the factory-girl-rails gem

Я включаю жемчужину factory -girl-rails только в моем gemspec и только в этом месте. Ничего в моем Gemfile и ничего в Gemfile для фиктивного приложения.

  s.add_development_dependency 'rspec-rails'
  s.add_development_dependency 'capybara'
  s.add_development_dependency 'factory_girl_rails'
  s.add_development_dependency 'shoulda'
  s.add_development_dependency 'vcr'
  s.add_development_dependency 'byebug'
  s.add_development_dependency 'better_errors'
  s.add_development_dependency 'binding_of_caller'

Ответ 2

Вот как мы обошли это. Как предположил @Vinh Tran, factory_girl_rails должен находиться в Gemfile приложения, над которым вы работаете как таковой:

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end

Кроме того, фиктивное приложение должно быть расположено в каталоге /spec, хотя на данный момент оно не заполняется фактическими моделями и т.д.

Наконец, команда rspec должна быть выпущена из каталога boxes, а не каталога core. Все эти вещи позволили нам успешно зарегистрировать factory и иметь успешные тестовые прогоны.

Ответ 3

2 вещи, которые вы можете попробовать:

  • размещение gem 'factory_girl_rails' внутри приложения boxes
  • создайте образец rspec внутри ядра с помощью factory и запустите его

Я думаю, что ваше приложение boxes не загружает драгоценные камни из ядра, оно просто загружает бизнес-логику

Ответ 4

Я получил это, когда моя спецификация не закончилась с _spec.rb. RubyMine без проблем запускала unit test, и все работало, за исключением Factory Girl.