我有一个模型测试,它检查是否没有输入字符串,默认值存储在db中,'pending'。我在迁移中创建了它,因此输入了一个默认值。它的工作原理是因为在Rails控制台中创建新的类实例时,值就在那里。然而,我的测试仍然因此错误而失败
Failure/Error: expect(@instance.send(method)).to eq(default)
expected: "pending"
got: nil
(compared using ==)
# -e:1:in `<main>'
这是Rspec测试
RSpec.describe Photo, :type => :model do
setup_factories
before do
@instance=photo
end
mandatory_string :firstname
mandatory_string :lastname
mandatory_string :email
# processes_attachment_to_attribute :attachment
boolean_default_false :optin
optional_string :phone
mandatory_string_with_default :workflow_state, 'pending'
这是我的助手方法,它定义了'mandatory_string_with_default'
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
为什么这个测试失败了?我该如何解决?
答案 0 :(得分:1)
它失败了,因为你将字段设置为nil
@instance.send("#{method}=",nil)
您的迁移中的default: 'pending'
会分配创建新对象的值,但如果您覆盖它,那么它将获取您的新值,请自行查看
photo = Photo.new
photo.workflow_state
=> 'pending'
photo.workflow_state = nil
photo.workflow_state
=> nil
如果您需要将空白值替换为&#39;默认&#39;你必须像这样手动实现它:
class Photo
def workflow_state
if self[:workflow_state].blank?
'default'
else
self[:workflow_state]
end
end
end