Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rspec试验应为';使用自己的助手方法不会失败,为什么会失败?轨道_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

Ruby on rails Rspec试验应为';使用自己的助手方法不会失败,为什么会失败?轨道

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

我有一个模型测试,它检查是否没有输入任何字符串,默认值存储在数据库“pending”中。我在迁移中创建了它,因此输入了默认值。这是因为在Rails控制台中,当我创建一个新的类实例时,值就在那里。然而,我的测试由于这个错误而一直失败

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