在命名空间模型上使用带Rspec的factory_girl_rails

我有一个networking服务,为多个不同的客户提供广告。 广告的结构因客户而异,因此,我使用客户名称的模型和控制器使用名称空间来区分广告。 从高层来看,看起来像这样:

'app/models/client1/ad.rb'

 class Client1::Ad < ActiveRecord::Base attr_accessible :title, :description end 

'app/models/client2/ad.rb'

 class Client2::Ad < ActiveRecord::Base attr_accessible :title, :description, :source end 

实际上,这些模型更复杂,有联系,但这不是重点。
我正在使用rspec-rails 2.4.0和factory_girl_rails 1.0.1编写一些unit testing,而我所有的工厂都很好。 但是,我无法为名称空间模型定义工厂。 我试过类似的东西:

 Factory.define :client1_ad, :class => Client1::Ad do |ad| ad.title "software tester" ad.description "Immediate opening" end 

 Factory.define :client2_ad, :class => Client2::Ad do |ad| ad.title "software tester" ad.description "Immediate opening" ad.source "feed" end 

它没有做这项工作。 我环顾四周,但是我看到的每一个例子都是使用非命名空间模型。 有人有主意吗? 任何input,不胜感激。

我在这里有一个最小的工作示例,也许你可以用它来查明你的问题在哪里。 你在dmarkow的回答中留下的评论意味着你在其他地方有一个错误。

应用程序/模型/酒吧/ foo.rb

 class Bar::Foo < ActiveRecord::Base end 

* DB /迁移/ 20110614204536_foo.rb *

 class Foo < ActiveRecord::Migration def self.up create_table :foos do |t| t.string :name end end def self.down drop_table :foos end end 

投机/ factories.rb

 Factory.define :foo, :class => Bar::Foo do |f| f.name 'Foooo' end 

*规格/型号/ foo_spec.rb *

 require 'spec_helper' describe Bar::Foo do it 'does foo' do foo = Factory(:foo) foo.name.should == 'Foooo' end end 

运行testing:

 $ rake db:migrate $ rake db:test:prepare $ rspec spec/models/foo_spec.rb . Finished in 0.00977 seconds 1 example, 0 failures 

希望能帮助到你。

我想也许FactoryGirl更改,因为这个答案已经发布。 我做了使它工作

 Factory.define do factory :foo, :class => Bar::Foo do |f| f.name 'Foooo' end end 

使用FactoryGirl4.5.0 )的最新版本,这是语法:

 FactoryGirl.define do factory :client1_ad, class: Client1::Ad do |f| f.title "software tester" f.description "Immediate opening" end end 

注意client1_ad可以是任何你想要的名字,因为我们已经强制识别它的类名

我发现这个问题与FactoryGirl查看相关的问题,经过一点点的阅读源代码我想通过重命名我的工厂可以解决我的问题。

当我有在模块内命名空间的模型类,例如: Admin::User我应该一直在这样定义我的工厂:

 factory :'admin/user', class: Admin::User do #... end 

而不是:

 factory :admin_user, class: Admin::User do #... end 

也许这个小小的信息可能会帮助别人有一天。 我的问题的细节是,我试图使用build(described_class)从我的RSpec specs中的工厂构build实例,这对于un-namespaced类,但不适用于模块内类。 原因在于,在查找工厂的时候,FactoryGirl将使用ActiveSupportunderscore助手来标准化工厂名称。

你有没有尝试传递实际的类,而不是与类名string:

 Factory.define :client1_ad, :class => Client1::Ad do |ad|