我有以下验证器:

# 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.

推荐答案

这是我为该文件设计的一个快速规范,它运行良好.我认为存根可能会被清理干净,但希望这足以让你开始.

require 'spec_helper'

describe 'EmailValidator' do

  before(:each) do
    @validator = EmailValidator.new({:attributes => {}})
    @mock = mock('model')
    @mock.stub('errors').and_return([])
    @mock.errors.stub('[]').and_return({})
    @mock.errors[].stub('<<')
  end

  it 'should validate valid address' do
    @mock.should_not_receive('errors')    
    @validator.validate_each(@mock, 'email', 'test@test.com')
  end

  it 'should validate invalid address' do
    @mock.errors[].should_receive('<<')
    @validator.validate_each(@mock, 'email', 'notvalid')
  end  
end

Ruby-on-rails相关问答推荐

错误正在被ViewComponent、Ruby on Rails中吞噬

用至少一个缺省值初始化Ruby数组的最简洁方法是什么?

是否可以使用 Turbo 帧更新 Rails 表单输入字段值?

Ruby on Rails form_with 不显示错误,卡在服务器端

如何在 Rails 中注释掉 ERB?

Rails 100% 新手问题 - send() 方法

有没有办法在 Rails 3.1 中检测用户代理

如何在两个日期之间生成随机日期和时间?

注册表单上是否需要 CSRF 保护?

SQLite3::BusyException

rspec 共享示例与共享上下文

Rails data-disable-with re-enable 按钮

如何找出现有 Rails 应用程序基于哪个 Rails 版本?

使用 AJAX 向 Rails 发送 Authenticity Token 的正确方法

如何拯救 OmniAuth::Strategies::OAuth2::CallbackError?

连接表的最佳 SQL 索引

rbenv:没有 gemsets 生存

默认情况下 haml

Sidekiq Rails 4.2 使用 Active Job 还是 Worker?有什么不同

Rails:如何将日期时间字符串解析为特定时区