Rspec测试不应该使用自己的辅助方法失败,为什么呢?轨道

时间:2014-07-12 13:07:39

标签: ruby-on-rails ruby rspec

我有一个模型测试,它检查是否没有输入字符串,默认值存储在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

为什么这个测试失败了?我该如何解决?

1 个答案:

答案 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