[英]Rails 5.2 rspec - How to test if a model is actually using a custom validator?
[英]RSpec test custom validator
我的模型中有以下驗證器:
class ContinuumValidator < ActiveModel::Validator
def validate(record)
if !record.end_time.nil? and record.end_time < record.start_time
record.errors[:base] << "An event can not be finished if it did not start yet..."
end
end
end
class Hrm::TimeEvent < ActiveRecord::Base
validates_with ContinuumValidator
end
如何使用Rspec進行測試?
這是我到目前為止所嘗試的:(感謝zetetic )
describe "validation error" do
before do
@time_event = Hrm::TimeEvent.new(start_time: "2012-10-05 10:00:00", end_time: "2012-10-05 09:00:00", event_type: 2)
end
it "should not be valid if end time is lower than start time" do
@time_event.should_not be_valid
end
it "raises an error if end time is lower than start time" do
@time_event.errors.should include("An event can not be finished if it did not start yet...")
end
end
但是我收到以下錯誤:
1) Hrm::TimeEvent validation error raises an error if end time is lower than start time
Failure/Error: @time_event.errors.should include("An event can not be finished if it did not start yet...")
expected #<ActiveModel::Errors:0x007fd1d8e02c50 @base=#<Hrm::TimeEvent id: nil, start_time: "2012-10-05 08:00:00", end_time: "2012-10-05 07:00:00", event_type: 2, employee_id: nil, created_at: nil, updated_at: nil, not_punched: false, validated: false, replace_id: nil>, @messages={}> to include "An event can not be finished if it did not start yet..."
Diff:
@@ -1,2 +1,5 @@
-["An event can not be finished if it did not start yet..."]
+#<ActiveModel::Errors:0x007fd1d8e02c50
+ @base=
+ #<Hrm::TimeEvent id: nil, start_time: "2012-10-05 08:00:00", end_time: "2012-10-05 07:00:00", event_type: 2, employee_id: nil, created_at: nil, updated_at: nil, not_punched: false, validated: false, replace_id: nil>,
+ @messages={}>
我究竟做錯了什么? 我怎樣才能實現目標? 任何幫助或建議將不勝感激。 謝謝。
問題是你期望@time_event.errors
的行為就像一個字符串數組。 它沒有,它返回ActiveModel :: Errors。 正如其他人指出的那樣,你還需要通過調用valid?
來觸發驗證valid?
:
it "raises an error if end time is lower than start time" do
@time_event.valid?
@time_event.errors.full_messages.should include("An event can not be finished if it did not start yet...")
end
沒有錯誤,因為您沒有調用觸發錯誤的事件。 這通常在創建或保存記錄時發生。 您可能不想在測試中訪問數據庫,然后您可以使用該方法valid?
像這樣:
it "raises an error if end time is lower than start time" do
@time_event.valid?
@time_event.errors.should include("An event can not be finished if it did not start yet...")
end
我個人會將這兩個測試合並為一個有效嗎? 在第一種情況下調用。
也是一個未成年人: if record.end_time
比if !record.end_time.nil?
。 (至少在我看來...... :-))
這個解決方案適合我(使用Mongoid):
該模型
class OpLog
...
field :from_status, type: String
field :to_status, type: String
...
validate :states_must_differ
def states_must_differ
if self.from_status == self.to_status
errors.add(:from_status, "must differ from 'to_status'")
errors.add(:to_status, "must differ from 'from_status'")
end
end
...
end
考試:
it 'is expected to have different states' do
expect { create(:oplog, from_status: 'created', to_status: 'created').to raise_error(Mongoid::Errors::Validations) }
end
所以在你的情況下,我會寫一個這樣的測試(如果使用ActiveRecord):
it 'raises an error if end time is lower than start time' do
expect { create(Hrm::TimeEvent.new(start_time: "2012-10-05 10:00:00", end_time: "2012-10-05 09:00:00", event_type: 2)) }.to raise_error(ActiveRecord::Errors)
end
我認為記錄沒有經過驗證,因此有效性沒有運行且沒有錯誤。 您可以在代碼輸出中看到這一點。 “驗證:false”
嘗試:
it "raises an error if end time is lower than start time" do
@time_event.valid?
@time_event.errors.should include("An event can not be finished if it did not start yet...")
end
你還沒有測試過驗證,而且我建議你做一個單一的規范。
describe "validation error" do
before { @time_event = Hrm::TimeEvent.new(start_time: "2012-10-05 10:00:00", end_time: "2012-10-05 09:00:00", event_type: 2) }
it "raises an error if end time is lower than start time" do
@time_event.valid?
@time_event.errors.should include("An event can not be finished if it did not start yet...")
end
end
class ContinuumValidator < ActiveModel::Validator
def validate(record)
if record.end_time and record.end_time < record.start_time
record.error.add_to_base << "An event can not be finished if it did not start yet..."
end
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.