6

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

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={}>

私は何を間違っていますか?どうすれば目標を達成できますか?どんな助けや提案もいただければ幸いです。ありがとう。

4

5 に答える 5

13

@time_event.errors問題は、文字列の配列のように動作することを期待していることです。そうではなく、ActiveModel::Errors を返します。他の人が指摘したように、次の呼び出しで検証をトリガーする必要もあります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
于 2013-02-28T13:33:00.557 に答える
3

このソリューションは私にとってはうまくいきます(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
于 2016-01-15T07:07:44.490 に答える
2

エラーをトリガーするイベントを呼び出していないため、エラーはありません。これは通常、レコードが作成または保存されるときに発生します。ただし、テストでデータベースにアクセスしたくない場合は、次の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

私は個人的に有効なので、これら 2 つのテストを 1 つにまとめますか? 最初のケースで呼び出されます。

また、マイナー:if record.end_timeよりも優れていif !record.end_time.nil?ます。(私の意見では、少なくとも.... :-) )

于 2013-02-28T13:28:34.247 に答える
0

レコードは検証されなかったため、検証は実行されず、エラーは発生しなかったと思います。これはコード出力で確認できます。「検証済み: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
于 2013-02-28T13:31:52.793 に答える
0

実際に検証をテストしていません。さらに、単一の仕様を作成することをお勧めします。

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
于 2013-02-28T13:34:34.640 に答える