ruby-on-rails - 使用 Minitest 测试自定义验证器

标签 ruby-on-rails validation unit-testing minitest custom-validators

我有多个带有电子邮件验证的模型。因此,我已将验证提取到自定义验证器中。我按照 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

到现在为止还挺好。但由于我已经将电子邮件验证的功能提取到它自己的范围内,我还想单独测试它。我不想为每个模型添加相同的电子邮件格式测试。

我找到了另一个 question除了 RSpec 之外,它也提出了同样的要求。但是由于我还没有使用过 stub 和模拟,我不知道如何将测试移植到 Minitest 测试中。我还没有找到任何使用 Minitest 测试自定义验证器的资源。

有谁知道如何在 Minitest 中为自定义验证器编写此类测试(不使用规范!)?

最佳答案

您在这里要求的(我认为)是在 中测试此验证器。隔离 .这意味着它将在隔离测试中测试一次,这将完全按照您所说的进行:

I don't want to add the same email format tests to every model.



我在这里采用的方法是在测试文件中创建一个测试类,混合 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

我没有测试上面的代码,但我认为它应该给你一个想法/方向。

高温高压

关于ruby-on-rails - 使用 Minitest 测试自定义验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33976516/

相关文章:

javascript - "zoid destroyed all error"来自 paypal 与 ruby​​ on rails 的集成

ruby-on-rails - 我不明白这个? (Rails 上的 ruby )

html - 去除按钮的阴影

regex - 如何验证正则表达式中两个下划线不在一起

ruby-on-rails - smalltalk 的 sinatra 是什么?

java - 如何在 Java 中使用正则表达式验证姓名、中间名和姓氏?

javascript - 有没有办法验证 asm.js 代码

ios - 快速对需要钥匙串(keychain)身份验证的私有(private)函数进行单元测试

multithreading - 如何优化Grails构建和测试执行速度?

.net - 将 [AutoFixture] SemanticComparison OfLikeness 应用于序列/集合/数组/IEnumerable