43

次のバリデータがあります。

# 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

4

6 に答える 6

45

これは私がそのファイルのためにノックアップした簡単な仕様であり、うまく機能します。スタブはおそらくクリーンアップできると思いますが、うまくいけば、これで十分に始めることができます。

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
于 2011-10-12T18:13:07.063 に答える