工厂女孩为什么选错了班级?

时间:2016-08-09 19:13:06

标签: ruby-on-rails ruby factory-bot

我有一个工厂女工厂定义如下:

FactoryGirl.define do
  factory :task do

    factory :facebook_task, class: Task::Facebook do
      # ...
    end

    factory :twitter_task, class: Task::Twitter do
      # ...
    end
  end
end

对于定义如下的模型:

class Task < ActiveRecord::Base
end

class Task::Twitter < Task
end

class Task::Facebook < Task
end

在我添加twitter gem明确定义:: Twitter模块

之前,一切正常
.../test/factories/tasks.rb:12: warning: toplevel constant Twitter referenced by Task::Twitter
Running via Spring preloader in process 51820
rake aborted!
NoMethodError: undefined method `new' for Twitter:Module
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/decorator/new_constructor.rb:9:in `new'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/decorator.rb:14:in `send'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/decorator.rb:10:in `method_missing'
Cleaning database...done.
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/decorator/invocation_tracker.rb:11:in `method_missing'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/decorator.rb:14:in `send'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/decorator.rb:10:in `method_missing'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/configuration.rb:19:in `block in initialize'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/attribute_assigner.rb:48:in `instance_exec'
Creating Beatles.../Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/attribute_assigner.rb:48:in `build_class_instance'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/attribute_assigner.rb:13:in `object'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/evaluation.rb:12:in `object'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/strategy/create.rb:9:in `result'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/factory.rb:42:in `run'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/factory_runner.rb:29:in `block in run'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/notifications.rb:166:in `instrument'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/factory_runner.rb:28:in `run'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/factory_girl-4.7.0/lib/factory_girl/strategy_syntax_method_registrar.rb:20:in `block in define_singular_strategy_method'
/Users/pupeno/Documents/code/buzz/lib/tasks/sample_data.rake:25:in `block (2 levels) in <top (required)>'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `block in load'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
/Users/pupeno/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
-e:1:in `<main>'
Tasks: TOP => sample_data:generate
(See full trace by running task with --trace)

为什么Factory Girl试图实例化Twitter而不是Task :: Twitter?

tasks.rb:12就是这一行:

factory :twitter_task, class: Task::Twitter do

我不知道它是如何引用顶级常量Twitter的。

1 个答案:

答案 0 :(得分:2)

尝试将类名用作字符串:

factory :facebook_task, class: 'Task::Facebook' do
  # ...
end

代替

factory :facebook_task, class: Task::Facebook do
  # ...
end
相关问题