FactoryGirl工厂用于命名空间类

Bra*_*ice 8 ruby rspec ruby-on-rails factory-bot

任何证明或反驳我的想法的文件链接都将非常感激; 我似乎找不到任何东西.

AFAIK,如果您有一个带Product模型的Rails应用程序,您可以将FactoryGirl工厂定义为

FactoryGirl.define do
  factory :product do
    # stuffs
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在测试中调用工厂(RSpec示例)

let(:product) { FactoryGirl.create(:product) }
Run Code Online (Sandbox Code Playgroud)

但你也可以用它来打电话

let(:product) { FactoryGirl.create(Product) }
Run Code Online (Sandbox Code Playgroud)

如果您希望保持模型测试更加动态并且可以使用RSpec的described_class帮助程序自由更改,这将非常有用.

我的问题:

我有一个恰好是命名空间的模型

class Namespace::MyModel < ActiveRecord::Base
  # model stuffs
end
Run Code Online (Sandbox Code Playgroud)

与工厂

FactoryGirl.define do
  factory :my_model, class: Namespace::MyModel do
    # factory stuffs
  end
end
Run Code Online (Sandbox Code Playgroud)

当试图使用RSpec的助手时......

RSpec.describe Namespace::MyModel do
  let(:my_object) { FactoryGirl.create(described_class) }
  # testing stuffs
end
Run Code Online (Sandbox Code Playgroud)

FactoryGirl抱怨工厂丢失

Factory not registered: Namespace::MyModel
Run Code Online (Sandbox Code Playgroud)

我是否错过了FactoryGirl的这个功能,却没有理解它的真正目的?或者是否有另一种方法可以定义我的工厂以正确解析?

Sta*_*hin 2

你为什么不尝试一下

RSpec.describe Namespace::MyModel do
  let(:my_object) { FactoryGirl.create(:my_factory) }
  # testing stuffs
end
Run Code Online (Sandbox Code Playgroud)

FactoryGirl通常使用工厂名称,而不是类名称,即定义。

您可以有多个工厂,它们定义同一类的实例。例如,它们之间的差异可能在于字段值。

或者您可以从描述的类名称动态获取工厂名称。在如何在 Ruby on Rails 中以编程方式查找命名空间/模块名称? 中已经对此进行了解答。