Ruby on rails Rspec试验应为';使用自己的助手方法不会失败,为什么会失败?轨道
我有一个模型测试,它检查是否没有输入任何字符串,默认值存储在数据库“pending”中。我在迁移中创建了它,因此输入了默认值。这是因为在Rails控制台中,当我创建一个新的类实例时,值就在那里。然而,我的测试由于这个错误而一直失败Ruby on rails Rspec试验应为';使用自己的助手方法不会失败,为什么会失败?轨道,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我有一个模型测试,它检查是否没有输入任何字符串,默认值存储在数据库“pending”中。我在迁移中创建了它,因此输入了默认值。这是因为在Rails控制台中,当我创建一个新的类实例时,值就在那里。然而,我的测试由于这个错误而一直失败 Failure/Error: expect(@instance.send(method)).to eq(default) expected: "pending" got: nil (compared using
Failure/Error: expect(@instance.send(method)).to eq(default)
expected: "pending"
got: nil
(compared using ==)
# -e:1:in `<main>'
这是我的助手方法,它定义了“带默认值的强制\u字符串\u”
def mandatory_string_with_default(method,default)
context "#{method} is a mandatory string which defaults to #{default}" do
it "should set a blank string to #{default}" do
@instance.send("#{method}=",nil)
expect(@instance).to be_valid
expect(@instance.send(method)).to eq(default)
end
end
end
这是我的工厂
FactoryGirl.define do
factory :photo do
firstname "MyString"
lastname "MyString"
email
optin false
phone "2345345"
workflow_state "pending"
end
end
移民问题
create_table :photos do |t|
t.string :firstname
t.string :lastname
t.string :email
t.string :attachment
t.boolean :optin, default: false
t.string :phone
t.string :workflow_state, default: 'pending'
t.timestamps
end
为什么这个测试失败了?如何修复它?它失败了,因为您在这里将字段设置为零
@instance.send("#{method}=",nil)
迁移中的默认值:“挂起”
会在创建新对象时指定值,但如果覆盖它,则会接受新值,请自行查看
photo = Photo.new
photo.workflow_state
=> 'pending'
photo.workflow_state = nil
photo.workflow_state
=> nil
如果需要将空白值替换为“默认值”,则必须按如下方式手动实现:
class Photo
def workflow_state
if self[:workflow_state].blank?
'default'
else
self[:workflow_state]
end
end
end
但是我正在将正确的参数传递给方法no?1) Photo workflow_state是一个强制字符串,默认为pending。如果将空白字符串设置为pendingNop,我试图解释的是:默认值在创建对象时出现(使用
Photo.new
)。在此之后,就不再有默认值,换句话说:它不会将空白值替换为您在迁移中设置的默认值。谢谢Benjamin,这是一个有用的答案。有时,逻辑使我感到困惑。
class Photo
def workflow_state
if self[:workflow_state].blank?
'default'
else
self[:workflow_state]
end
end
end