Tob*_*ias 5 validation unit-testing ruby-on-rails custom-validators minitest
我有多个带有电子邮件验证的模型。因此,我已将验证提取到自定义验证器中。我按照Rails Guides的教程进行了修改。
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors[attribute] << (options[:message] || "is not an email")
end
end
end
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。但是由于我已经将电子邮件验证的功能提取到了它自己的范围内,所以我也想单独测试它。我不想为每个模型添加相同的电子邮件格式测试。
我发现了另一个问题,它也问了同样的问题,但对于 RSpec。但是由于我还没有使用过存根和模拟,我不知道如何将测试移植到 Minitest 测试中。我还没有找到任何使用 Minitest 测试自定义验证器的资源。
有谁知道如何在 Minitest 中为自定义验证器编写此类测试(不使用规范!)?
你在这里要求的是(我认为)孤立地测试这个验证器。这意味着它将在单独的测试中进行一次测试,这将完全按照您所说的进行:
我不想为每个模型添加相同的电子邮件格式测试。
我在这里采用的方法是在测试文件中创建一个测试类,混合ActiveRecord::Validations模块并测试类本身。
# test_file.rb
require 'test_helper'
class EmailValidatable
include ActiveModel::Validations
validates_with EmailValidator
attr_accessor :email
end
class EmailValidatorTest < Minitest::Test
def test_invalidates_object_for_invalid_email
obj = EmailValidatable.new
obj.email = "invalidemail"
refute obj.valid?
end
def test_adds_error_for_invalid_email
obj = EmailValidatable.new
obj.email = "invalidemail"
refute_nil obj.errors[:email]
end
def test_adds_no_errors_for_valid_email
obj = EmailValidatable.new
obj.email = "valid@email.com"
assert_nil obj.errors[:email]
assert obj.valid?
end
end
Run Code Online (Sandbox Code Playgroud)
我没有测试上面的代码,但我认为它应该给你一个想法/方向。
HTH
| 归档时间: |
|
| 查看次数: |
1734 次 |
| 最近记录: |