我有以下验证器:
# Source: http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators
# app/validators/email_validator.rb
class EmailValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
object.errors[attribute] << (options[:message] || "is not formatted properly")
end
end
end
我希望能够在我的lib目录中的RSpec中测试这个。到目前为止的问题是我不确定如何初始化一个EachValidator
。
7条答案
按热度按时间v64noz0r1#
我不是另一种方法的狂热爱好者,因为它把测试和实现联系得太紧密了。而且,它相当难以遵循。这是我最终使用的方法。请记住,这是我的验证器实际上所做的一个严重的过度简化......只是想更简单地演示它。肯定有优化要做
相关质量标准:
基本上,我的方法是创建一个伪对象“Validatable”,这样我们就可以实际测试它的结果,而不是对实现的每个部分都有期望
fumotvh32#
这是我为那个文件设计的一个快速规范,它运行得很好。我想可能会清理掉存根,但希望这足以让你开始。
z18hc3ub3#
我建议创建一个匿名类用于测试目的,例如:
这将防止硬编码类,如
Validatable
,它可以在多个规范中引用,导致由于不相关的验证之间的交互而导致意外和难以调试的行为,您正在尝试隔离测试这些行为。8tntrjer4#
受“Gazler”回答的启发,我得出了以下结论:模拟模型,但使用
ActiveModel::Errors
作为错误对象。这大大减少了模拟。flmtquvp5#
还有一个例子,扩展一个对象而不是在规范中创建新类。BitcoinAddressValidator是这里的自定义验证器。
u2nhd7ah6#
使用Neals的优秀示例作为基础,我得出了以下结论(针对Rails和RSpec 3)。
sqxo8psd7#
如果可以不使用存根,我更喜欢这种方式: