Sim*_*eev 35 rspec namespaces ruby-on-rails-3 factory-bot
我有一个网络服务,为几个不同的客户提供广告.广告的结构因客户端而异,因此,我通过客户名称为我的模型和控制器使用名称空间来区分广告.从高层看,它看起来像这样:
'app/models/client1/ad.rb'
class Client1::Ad < ActiveRecord::Base
attr_accessible :title, :description
end
Run Code Online (Sandbox Code Playgroud)
'app/models/client2/ad.rb'
class Client2::Ad < ActiveRecord::Base
attr_accessible :title, :description, :source
end
Run Code Online (Sandbox Code Playgroud)
实际上,这些模型更复杂并且具有关联性,但这不是重点.
我正在使用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
Run Code Online (Sandbox Code Playgroud)
和
Factory.define :client2_ad, :class => Client2::Ad do |ad|
ad.title "software tester"
ad.description "Immediate opening"
ad.source "feed"
end
Run Code Online (Sandbox Code Playgroud)
它没有完成这项工作.我环顾四周,但我看到的每个例子都使用非命名空间的模型.有人有主意吗?任何输入都非常感谢.
Jor*_*jon 49
我在这里有一个最小的工作示例,也许您可以使用它来查明您的问题所在.你在dmarkow的回答中留下的评论告诉我你在其他地方有错误.
应用程序/模型/酒吧/ foo.rb
class Bar::Foo < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
*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
Run Code Online (Sandbox Code Playgroud)
投机/ factories.rb
Factory.define :foo, :class => Bar::Foo do |f|
f.name 'Foooo'
end
Run Code Online (Sandbox Code Playgroud)
*规格/型号/ foo_spec.rb*
require 'spec_helper'
describe Bar::Foo do
it 'does foo' do
foo = Factory(:foo)
foo.name.should == 'Foooo'
end
end
Run Code Online (Sandbox Code Playgroud)
运行测试:
$ rake db:migrate
$ rake db:test:prepare
$ rspec spec/models/foo_spec.rb
.
Finished in 0.00977 seconds
1 example, 0 failures
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
小智 12
我想也许FactoryGirl自从这个答案发布后就发生了变化.我做了让它工作
Factory.define do
factory :foo, :class => Bar::Foo do |f|
f.name 'Foooo'
end
end
Run Code Online (Sandbox Code Playgroud)
使用当前最新版本的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
Run Code Online (Sandbox Code Playgroud)
请注意,您client1_ad
可以使用任何名称,因为我们已经强制标识其类名.