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

|| 我有一个网络服务,可以向几个不同的客户提供广告。广告的结构在客户端之间有所不同,因此,我通过客户端名称在模型和控制器的名称空间中使用它们来区分广告。从高层次看,它看起来像这样:
\'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编写一些单元测试,并且我所有的工厂都工作得很好。但是,我无法为命名空间模型定义工厂。我已经尝试过类似的方法:
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
它没有做这份工作。我环顾四周,但是看到的每个示例都使用了非命名空间模型。有人有想法么?任何输入,不胜感激。     
已邀请:
        我这里有一个最小的工作示例,也许您可​​以使用它来确定问题出在哪里。您在dmarkow的答案上留下的评论向我暗示您在其他地方有错误。 app / models / bar / foo.rb
class Bar::Foo < ActiveRecord::Base
end
* db / migrate / 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
spec / factories.rb
Factory.define :foo, :class => Bar::Foo do |f|
  f.name \'Foooo\'
end
* spec / models / foo_spec.rb *
require \'spec_helper\'

describe Bar::Foo do

  it \'does foo\' do
    foo = Factory(:foo)
    foo.name.should == \'Foooo\'
  end
end
运行测试:
$ 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
    
        当前最新版本为
FactoryGirl
(4.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
规范从工厂构建实例,这对于未命名空间的类很好,但不适用于模块内部的类。原因是在内部查找工厂时,FactoryGirl将使用
ActiveSupport
underscore
帮助程序来标准化工厂名称。     
        您是否尝试过传递实际的类,而不是传递具有类名的字符串:
Factory.define :client1_ad, :class => Client1::Ad do |ad|
    

要回复问题请先登录注册