2016-04-08 13 views
2

Der Versuch, ein paar Tests für meine benutzerdefinierten Validierungen zu implementieren, und ich stieß auf this example.Test für benutzerdefinierten Validator erstellen

Mein Validator sieht aus wie diese

class FutureValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    if value == nil 
     record.errors[attribute] << " can't be nil" 
    elsif value < Time.now 
     record.errors[attribute] << (options[:message] || "can't be in the past!") 
    end 
    end 
end 

Und ich habe soweit dies mit dem oben genannten Beispiel als Richtlinie bekommen.

require 'test_helper' 

class FutureValidatorable 
    include ActiveModel::Validations 
    # validates_with FutureValidator 
    attr_accessor :future 

    validates :future, future: true 
end 

class FutureValidator < ActiveSupport::TestCase 

    future_value = [nil] 
    def obj; @obj ||= FutureValidatorable.new; end 

    test 'future validator returns proper error code when nil is passed to it' do 
    future_value.each do |value| 
     @obj.value = value 
     assert_not obj.valid? 
    end 
    end 

In diesem Stadium bekomme ich die Fehlermeldung, die ich bekomme ist wie folgt.

rake aborted! TypeError: superclass mismatch for class FutureValidator

Ich bin nicht sicher, wie Sie von hier fortfahren.

Antwort

3

Sieht aus, als ob Ihr Modell und TestCase denselben Klassennamen haben. Wenn Sie den Namen Ihres Tests ändern, sollte das Problem behoben sein.

+0

Guter Fang. Ich habe das erst 5 Sekunden vor der Veröffentlichung dieser Antwort bemerkt. – CheeseFry

+0

Irgendwelche Vorschläge, um einen praktikablen Test auf diesem zu bekommen? 'NoMethodError: undefinierte Methode' value = 'für nil: NilClass' ist meine aktuelle Fehlermeldung beim Test. – CheeseFry

+0

sieht aus wie Ihre 'obj' Methode nicht aufgerufen wird. Verwenden Sie entweder "obj" anstelle von "@ obj" in Ihrem Testfall oder deklarieren Sie es innerhalb einer "def setup" -Methode des Tests. –

Verwandte Themen