不能重复NilClass - Rails

时间:2014-01-25 17:39:54

标签: rspec model

当我运行RSpec时,我收到错误can't dup NilClass

我尝试添加unloadable,但它无法修复它。

我认为这是导致错误的函数:

class User < ActiveRecord::Base

  before_save :create_permalink

  validates :username,  presence: true, length: { maximum: 50, minimum: 3 }, 
                        uniqueness: { case_sensitive: false }
  validates :permalink, presence: true, length: { maximum: 50, minimum: 3 }, 
                        uniqueness: { case_sensitive: false }
  private

    def create_permalink
      self.permalink = username.dup.parameterize
    end
end

user_spec.rb

require 'spec_helper'

describe User do
  before do
    @user = User.new(name: Faker::Name.name, username: "example",
                     email: Faker::Internet.email, password: "password",
                     password_confirmation: "password")
  end

  .
  .
  .

end

测试失败包括:

it { should validate_presence_of(:username) }
it { should validate_uniqueness_of(:permalink) }

我也尝试过添加:

config.reload_plugins = true if RAILS_ENV == ‘development’

到我的environment.rb文件,但是再次没有用。

我如何阻止这种情况发生,因为它使我的测试失败了?

1 个答案:

答案 0 :(得分:0)

您的测试是使用nil User创建username对象。对此有几种可能的修复方法,如果没有看到测试代码本身就难以选择。它可以像设置测试用户时指定用户名一样简单,例如

user = User.create username: 'Test User'

如果您的RSpec测试代码更复杂,请在其中包含您的RSpec测试代码。

由于用户名是用户模型中的必填字段,因此可能值得为其添加验证:

class User < ActiveRecord::Base
  validates :username, presence: true
  ...
end

验证在before_save过滤器之前运行,因此您的测试中会出现更有意义的错误。