我正在尝试测试用户模型,该模型具有以下验证后运行的方法:
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) }
有没有办法可以绕过这个错误?
答案 0 :(得分:2)
没有。 shoulda匹配器使用的方法是为相关列分配各种值,并确保验证按预期运行。如果您的模型不能支持(即避免引发错误)特定的shoulda匹配器使用的值,那么您需要更改模型以支持值(即不会引发nil
密码的错误在这种情况下)或停止使用该特定的应该匹配。