Schrieb einen benutzerdefinierten Validator in meinem Rails-Projekt und möchte einen Test schreiben, wenn nil
in den Datensatz übergeben wird.Benutzerdefinierter Validator-Test - enthält Fehler?
Der Validator Code
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
Mögliche Test
test "future validator rejects nil values" do
@obj.future = nil
assert_includes @obj.errors
end
Ich mag würde, um nicht nur einen Test schreiben, dass assert_not @obj.valid?
prüft aber zeigen tatsächlich, dass die Nachricht Fehler zurückgeschickt werden. Wenn das zu viel verlangt, werde ich mich damit begnügen zu wissen, dass eine Fehlermeldung zurückkommt, aber zur Zeit funktioniert mein Test nicht.
Es kehrt
ArgumentError: wrong number of arguments (1 for 2..3)
aktualisieren immer nah an einem grünen Test
test "future validator rejects nil values" do
@obj.future = nil
@obj.valid?
assert_includes @obj.errors.messages, {future: ["can't be nil"]}
end
kehrt
FutureValidatorTest#test_future_validator_rejects_nil_values [/Users/rwdonnard/WorkSpace/charter-pay-api/test/models/future_validator_test.rb:42]: Expected {:future=>["can't be nil"]} to include {:future=>["can't be nil"]}.
Wie geht es Ihnen es benutzen? Können Sie den Modellcode dort posten, wo er aufgerufen wird? Ich verstehe nicht wirklich, warum Sie überprüfen, ob der Wert Null ist, Sie implementieren den Anwesenheitsvalidierer erneut. Sie könnten diesen Teil entfernen und 'validates: date, present: true, future: true' verwenden. –
@ j-dexx entschuldigen Sie meine Ignoranz, aber würde' presence: true' eine ausführliche/menschenlesbare Fehlermeldung liefern, die sie 'nil bestanden haben '? – CheeseFry
die Standardmeldung ist "kann nicht leer sein" –