Shoulda Matchers - 未定义的方法gsub

时间:2013-12-19 16:59:54

标签: ruby-on-rails ruby rspec-rails shoulda

我正在尝试测试用户模型,该模型具有以下验证后运行的方法:

 def generate_slug(args)
  column = args[:column]
  self.slug = slug_title(column)
 end

private

def slug_text(column)
  self.send(column).gsub(/[^0-9a-z ]/i, '').gsub(' ','-').downcase
end

def slug_number_of_occurences(slug_title)
  self.class.where(slug: slug_title).count
end

def slug_title(column)
  count = 0
  slug_title = slug_text(column)
  until slug_number_of_occurences(slug_title) == 0
    slug_title = slug_text(column) + (count == 0 ? "" : count.to_s)
    count += 1
  end
  return slug_title
end

这些方法导致我的一些shoulda匹配器测试失败,并出现以下错误:

 ←[31mNoMethodError←[0m:
   ←[31mundefined method `gsub' for nil:NilClass←[0m
m     # ./app/models/concerns/shared/sluggable.rb:18:in `slug_text'←[0m
m     # ./app/models/concerns/shared/sluggable.rb:27:in `slug_title'←[0m
m     # ./app/models/concerns/shared/sluggable.rb:8:in `generate_slug'←[0m
m     # ./app/models/user.rb:10:in `block in <class:User>'←[0m
m     # ./spec/models/user_spec.rb:28:in `block (2 levels) in <top (required)>'←[0m

一个例子是:

it { should ensure_length_of(:password).is_at_least(6) }

有没有办法可以绕过这个错误?

1 个答案:

答案 0 :(得分:2)

没有。 shoulda匹配器使用的方法是为相关列分配各种值,并确保验证按预期运行。如果您的模型不能支持(即避免引发错误)特定的shoulda匹配器使用的值,那么您需要更改模型以支持值(即不会引发nil密码的错误在这种情况下)或停止使用该特定的应该匹配。