鉴于以下内容
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)
您如何为公司和用户定义工厂,包括双向关联?这是我的尝试
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
Run Code Online (Sandbox Code Playgroud)
现在我试试
Factory :user
Run Code Online (Sandbox Code Playgroud)
也许不出所料,这会导致无限循环,因为工厂递归地使用彼此来定义自己.
更令人惊讶的是,我没有提到如何在任何地方做到这一点,是否有一种模式来定义必要的工厂或我做了一些从根本上错误的事情?
ruby-on-rails associations has-and-belongs-to-many factory-bot
我有模型人物有很多图像,其中图像有一个名为data的Paperclip附件字段,缩写版本如下所示:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Run Code Online (Sandbox Code Playgroud)
人员必须至少附上一张图像.
使用FactoryGirl时,我的代码类似于以下内容:
Factory.define :image do |a|
a.data { File.new(File.join(Rails.root, 'features', 'support', 'file.png')) }
a.association :person
end
Factory.define :person do |p|
p.first_name 'Keyzer'
p.last_name 'Soze'
p.after_create do |person|
person.assets = [Factory.build(:image, :person => person)]
end
# p.images {|images| [images.association(:image)]}
end
Run Code Online (Sandbox Code Playgroud)
(注意,我也尝试过上面注释的代码也尝试了)大多数时候,当我运行黄瓜功能时,我得到的错误类似于以下内容:
没有这样的文件或目录 - /tmp/stream,9887,0.png(Errno :: ENOENT)
...
有时测试成功运行.
谁能告诉我我在这里遇到的问题是什么,或者他们如何一起使用FactoryGirl和Paperclip来实现我想要实现的目标?
我正在使用Rails 3.
我正在测试一个带有后创建回调的模型,我想在测试时只在某些情况下运行.如何从工厂跳过/运行回调?
class User < ActiveRecord::Base
after_create :run_something
...
end
Run Code Online (Sandbox Code Playgroud)
厂:
FactoryGirl.define do
factory :user do
first_name "Luiz"
last_name "Branco"
...
# skip callback
factory :with_run_something do
# run callback
end
end
Run Code Online (Sandbox Code Playgroud) Factory Girl介绍描述了FactoryGirl.build()和之间的区别FactoryGirl.create():
# Returns a User instance that's not saved
user = FactoryGirl.build(:user)
# Returns a saved User instance
user = FactoryGirl.create(:user)
Run Code Online (Sandbox Code Playgroud)
我仍然不明白两者之间的实际差异.有人可以给出一个例子,你想要使用一个而不是另一个吗?谢谢!
我正在尝试使用Faker gem将一些假数据填充到工厂中:
Factory.define :user do |user|
user.first_name Faker::Name::first_name
user.last_name Faker::Name::last_name
user.sequence(:email) {|n| "user#{n}@blow.com" }
end
Run Code Online (Sandbox Code Playgroud)
但是,虽然我希望这会生成具有不同first_name和last_names的用户,但每个用户都是相同的:
>> Factory(:user)
=> #<User id: 16, email: "user7@blow.com", created_at: "2011-03-18 18:29:33",
updated_at: "2011-03-18 18:29:33", first_name: "Bailey", last_name: "Durgan">
>> Factory(:user)
=> #<User id: 17, email: "user8@blow.com", created_at: "2011-03-18 18:29:39",
updated_at: "2011-03-18 18:29:39", first_name: "Bailey", last_name: "Durgan">
Run Code Online (Sandbox Code Playgroud)
如何让Faker gem为每个用户生成新名称,而不仅仅重用原始用户?
有人能告诉我,如果我只是以错误的方式进行设置吗?
我有以下具有has_many.through关联的模型:
class Listing < ActiveRecord::Base
attr_accessible ...
has_many :listing_features
has_many :features, :through => :listing_features
validates_presence_of ...
...
end
class Feature < ActiveRecord::Base
attr_accessible ...
validates_presence_of ...
validates_uniqueness_of ...
has_many :listing_features
has_many :listings, :through => :listing_features
end
class ListingFeature < ActiveRecord::Base
attr_accessible :feature_id, :listing_id
belongs_to :feature
belongs_to :listing
end
Run Code Online (Sandbox Code Playgroud)
我正在使用Rails 3.1.rc4,FactoryGirl 2.0.2,factory_girl_rails 1.1.0和rspec.这是我对:listing工厂的基本rspec rspec健全性检查:
it "creates a valid listing from factory" do
Factory(:listing).should be_valid
end
Run Code Online (Sandbox Code Playgroud)
这是工厂(:上市)
FactoryGirl.define do
factory :listing do
headline 'headline'
home_desc 'this is the home …Run Code Online (Sandbox Code Playgroud) 我在开发环境中使用rails控制台,我想使用工厂.我怎样才能访问它们?
我试过require "FactoryGirl"哪个回归
1.9.3p393 :301 > require "FactoryGirl"
LoadError: cannot load such file -- FactoryGirl
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个模拟来自Dropbox的REST服务的一些返回值的测试,该服务通过嵌套哈希为我提供数据.
我无法弄清楚如何编码我的工厂,因为返回结果是一个带有内部的数组.会怎么样?
Factory.define :dropbox_hash do
??
end
Run Code Online (Sandbox Code Playgroud)
Dropbox数据如下所示:
["/home", {"revision"=>48, "rev"=>"30054214dc", "thumb_exists"=>false, "bytes"=>0, "modified"=>"Thu, 29 Dec 2011 01:53:26 +0000", "path"=>"/Home", "is_dir"=>true, "icon"=>"folder_app", "root"=>"app_folder", "size"=>"0 bytes"}]
Run Code Online (Sandbox Code Playgroud)
在我的RSpec中,我想要像这样的工厂电话:
Factory.create(:dropbox_hash)
Run Code Online (Sandbox Code Playgroud) 我正在使用Factory Girl在我的模型/单元测试中为一个组创建两个实例.我正在测试模型以检查对.current的调用是否仅根据expiry属性返回'current'组,如下所示......
describe ".current" do
let!(:current_group) { FactoryGirl.create(:group, :expiry => Time.now + 1.week) }
let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) }
specify { Group.current.should == [current_group] }
end
Run Code Online (Sandbox Code Playgroud)
我的问题是我在模型中验证了新组的到期时间是在今天的日期之后.这会引发下面的验证失败.
1) Group.current
Failure/Error: let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) }
ActiveRecord::RecordInvalid:
Validation failed: Expiry is before todays date
Run Code Online (Sandbox Code Playgroud)
有没有办法在使用Factory Girl创建时强制创建组或绕过验证?
我有一个通过多态关联属于配置文件的用户模型.我选择这个设计的原因可以在这里找到.总而言之,该应用程序的许多用户具有真正不同的配置文件.
class User < ActiveRecord::Base
belongs_to :profile, :dependent => :destroy, :polymorphic => true
end
Run Code Online (Sandbox Code Playgroud)
class Artist < ActiveRecord::Base
has_one :user, :as => :profile
end
Run Code Online (Sandbox Code Playgroud)
class Musician < ActiveRecord::Base
has_one :user, :as => :profile
end
Run Code Online (Sandbox Code Playgroud)
选择这个设计后,我很难做出好的测试.使用FactoryGirl和RSpec,我不确定如何以最有效的方式声明关联.
factories.rb
Factory.define :user do |f|
# ... attributes on the user
# this creates a dependency on the artist factory
f.association :profile, :factory => :artist
end
Factory.define :artist do |a|
# ... attributes for the artist profile
end
Run Code Online (Sandbox Code Playgroud)
user_spec.rb
it "should …Run Code Online (Sandbox Code Playgroud)