最近我从fixtures切换到factory_girl来测试我的Ruby on Rails应用程序.如果我运行rake test:units,要在my/units目录中运行测试,它们都运行完美.如果我使用rake test:functionals运行我的功能测试(在我的/ functional目录中),情况也是如此.
但是,如果我只是运行rake测试,同时运行我的单元和功能测试,我的验证将在第二组测试中失败(在这种情况下是功能的),并显示消息"验证失败:名称已被采用".
我相信这是由功能测试创建的,这些参数创建的参数与在单元测试中创建的对象具有相同的参数 - 这使我相信在单元测试和功能测试之间不会清除测试数据库.
我使用factory_girl的序列来为对象提供唯一的属性,这意味着factory_girl在测试之间被重置,而数据库则没有.我该怎么做才能解决这个问题?有没有办法在我的两个测试包之间清除数据库?
# Models
class User < ActiveRecord::Base
has_many :items
end
class Items < ActiveRecord::Base
belongs_to :user
validates_presence_of :user_id
end
# Factories
Factory.define(:user) do |u|
u.name "foo"
end
Factory.define(:user_with_items, :parent => :user) do |u|
u.items {|items| [items.association(:item), items.association(:item)]}
end
Factory.define(:item) do |i|
i.color "red"
end
Factory.define(:item_with_user, :parent => :user) do |i|
i.association(:user)
end
Run Code Online (Sandbox Code Playgroud)
如果你运行@user = Factory(:user_with_items)然后@user.items包含两个项目.问题是项目与数据库中的用户无关.如果你重新加载关联,@user.items(true)那么你会得到一个空数组.我知道你可以手动构建它们或者自己创建辅助方法来构建对象图,但我想避免这种情况.
所以,我的问题是如何在尊重构建策略的同时在factory_girl中建立一个has_many关系?
我在rails应用程序中使用factory_girl插件.对于每个模型,我有一个包含工厂数据的相应ruby文件,例如
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
# t.user ???
end
Run Code Online (Sandbox Code Playgroud)
我有很多不同类型的用户(已在用户工厂中定义).如果我尝试以下方法:
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
t.user Factory(:valid_user) # Fails
end
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
# No such factory: valid_user (ArgumentError)
Run Code Online (Sandbox Code Playgroud)
:valid_user实际上是有效的 - 我可以在我的测试中使用它 - 只是不在我的工厂中.有什么方法可以在这里使用另一个文件中定义的工厂吗?
我认为我的用户工厂正在构建中存在问题.我收到一个错误,说密码不能为空,但它明确地设置在我的workers.rb中.有没有人看到我可能遗失的任何东西?或者为什么规范失败的原因?我为其他一个模型做了一个非常类似的事情,它似乎很成功.我不确定错误是否是由设计引起的.
User should create a new instance of a user given valid attributes
Failure/Error: User.create!(@user.attributes)
ActiveRecord::RecordInvalid:
Validation failed: Password can't be blank
# ./spec/models/user_spec.rb:28:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
Factory.define :user do |user|
user.name "Test User"
user.email "user@example.com"
user.password "password"
user.password_confirmation "password"
end
Run Code Online (Sandbox Code Playgroud)
require 'spec_helper'
describe User do
before(:each) do
@user = Factory.build(:user)
end
it "should create a new instance of a user given valid attributes" do
User.create!(@user.attributes)
end
end
Run Code Online (Sandbox Code Playgroud)
class User < ActiveRecord::Base
# …Run Code Online (Sandbox Code Playgroud) 关于fabrication宝石的资源似乎很少,我找不到区分它的特征的良好比较factory_girl.随着版本的fabrication-2.2.3和factory_girl-4.0.0,我很难找到一个差异.这些宝石如何比较?有什么可以做出fabrication更好的选择?为什么?他们俩都融合了吗?
我尝试使用RSpec在Windows上测试我的Rails 3应用程序.我已经编写了测试和工厂,但无法解决在命令行上运行RSpec时引发的问题.
以下是其中一个测试文件:require'pec_helper'
describe "SignIns" do
it "can sign in" do
user = FactoryGirl.create(:user)
visit new_user_session_path
fill_in "login", with: user.username
fill_in "password", with: user.password
click_on "sign in"
current_user.username.should == user.username
end
end
Run Code Online (Sandbox Code Playgroud)
这是工厂.rb:
factory :layout do
name "layout1"
end
factory :club do
sequence(:name) { |i| "Club #{i}" }
contact_name "John Doe"
phone "+358401231234"
email "#{name}@example.com"
association :layout
end
factory :user do
sequence(:username) { |i| "user#{i}" }
password 'password'
email "test@example.com"
club
end
Run Code Online (Sandbox Code Playgroud)
当我尝试运行RSpec时,它会出现以下错误:
trait not registered: name
#C: in 'object' …Run Code Online (Sandbox Code Playgroud) 这些是2个简单的模型:
class Post < ActiveRecord::Base
has_one :asset, :dependent => :destroy
validates :asset, presence: true
end
class Asset < ActiveRecord::Base
belongs_to :post
end
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建这样的工厂:
factory :post do
# fields...
asset { FactoryGirl.create(:asset) }
end
factory :asset do
# fields...
post
end
Run Code Online (Sandbox Code Playgroud)
但是,运行规范它会进入一个循环.
我也试过这个:
factory :post do
# fields...
before(:create) do |post, evaluator|
FactoryGirl.create_list(:asset, 1, post: post)
end
end
Run Code Online (Sandbox Code Playgroud)
但最终在"验证失败:资产不能空白".
我如何表达我的情况?
这最近引起了一些挫折......
似乎在我的黄瓜测试中使用工厂,在某些情况下会导致AssociationTypeMismatch错误,例如:
MyModel(#65776650)期待,得到MyModel(#28190030)(ActiveRecord :: AssociationTypeMismatch)
当存在关联引用时,似乎会发生这些 - 就好像Factory创建的对象与实际对象不同.有关更多详细信息,请参阅此问题:Cucumber重复类问题:AssociationTypeMismatch
我一直在逐步将Factory调用更改为真正的Model.create或mock_model调用.继续使用工厂女孩会很好......我想知道是否有什么我可能做错了?
谢谢
你好,我需要为我的模型建立工厂,例如
Factory.define :farm do |f|
f.name { Factory.next :name }
f.harvest '3'
f.offers 'Random'
f.latitude '43'
f.longitude '-70'
f.about 'We rocks!'
f.logo { Factory.next :logo } # this doesn't work
end
Run Code Online (Sandbox Code Playgroud)
现在我只是将字符串"#{n} .jpg"传递到我的徽标字段中,这不起作用,如何评估此字段?我正在使用CarrierWave进行上传.
我有这5个模型:卫报,学生,关系,关系类型和学校.在他们之间,我有这些联想
class Guardian < ActiveRecord::Base
belongs_to :school
has_many :relationships, :dependent => :destroy
has_many :students, :through => :relationships
end
class Student < ActiveRecord::Base
belongs_to :school
has_many :relationships, :dependent => :destroy
has_many :guardians, :through => :relationships
end
class Relationship < ActiveRecord::Base
belongs_to :student
belongs_to :guardian
belongs_to :relationship_type
end
class School < ActiveRecord::Base
has_many :guardians, :dependent => :destroy
has_many :students, :dependent => :destroy
end
class RelationshipType < ActiveRecord::Base
has_many :relationships
end
Run Code Online (Sandbox Code Playgroud)
我想写一个定义关系的FactoryGirl.每个关系都必须有一个监护人和一个学生.这两个人必须属于同一所学校.监护人工厂与学校有联系,学生工厂也是如此.我一直无法让他们在同一所学校建造.我有以下代码:
FactoryGirl.define do
factory :relationship do
association :guardian
association :student, :school => …Run Code Online (Sandbox Code Playgroud) factory-bot ×10
rspec ×4
ruby ×4
unit-testing ×2
carrierwave ×1
cucumber ×1
devise ×1
factory ×1
tdd ×1
testing ×1