0

そのため、クラス TimeBank があり、その更新が行われ、他の 2 つの既存の属性 (DB 列) を操作する 2 つの新しい仮想属性を取得しています。

class TimeBank < ActiveRecord::Base
  # validations, consts, few other methods omitted for brevity

  def date_worked
    @date_worked ||= self.start.to_date
  rescue
    Date.current
  end

  def date_worked=(date_worked_val)
    self.attributes['date_worked'] = date_worked_val
  end

  def hours_worked
    @hours_worked ||= hours
  rescue NoMethodError
    nil
  end

  def hours_worked=(hours_worked_val)
    self.attributes['hours_worked'] = hours_worked_val
  end

  def hours
    if attributes["hours"]
      read_attribute(:hours).to_f 
    else
      ((finish - start)/1.hour).to_f
    end
  rescue NoMethodError
    0.0
  end

  # other methods omitted for brevity...
end

アプリケーションを使用すると、すべてが正常に機能します。テストを実行するとき、TimeBank をインスタンス化するときはいつでも、上記のステートメントの結果、つまり と の今日の日付のみを取得rescueします。セッターは、(テスト中に) 何もしないように、無反応に見えます。date_worked0.0hours_worked

使用するセッターも定義しましたがwrite_attribute(:date_worked, 'SOMEVAL')、それがアプリケーション内で機能している間、テストの場合、次のようなエラーが発生します

ActiveModel::MissingAttributeError: can't write unknown attribute hours_worked'
app/models/time_bank.rb:110:in `hours_worked='

テストの例は次のようになります。

describe "virtual attributes test" do
  subject { TimeBank.new({member: @gus, admin_id: @addy.id, date_worked: Date.yesterday, hours_worked: 2.5, time_type: "store_shift", approved: true}) }

  it "tests setter callbacks" do
    subject.date_worked.must_equal Date.yesterday
    subject.hours_worked.must_equal 2.5
  end
end

どちらのアサーションも、今日の日付と 0.0 (ゲッターで指定された「デフォルト」) を取得するため、常に失敗します。テストの直前に行に属性を設定しても、効果はありません。

何が間違っているのかわかりません。これら 2 つの仮想属性のテストを書きたいのですが、それらの値を設定しても効果がないようです。テスト内で機能しない理由はわかりませんが、アプリケーション内では正常に機能します。同じコードが、アプリケーション コントローラー内で期待どおりに機能します。誰かが理由を理解するのを手伝ってくれますか?

4

1 に答える 1

0

問題はセッターメソッドにあります。に何かを割り当てる代わりに、次self.attributes["virtual_attribute"]のようにインスタンス変数を設定して返す必要があります。

def virtual_attribute=(virtual_attr_value)
  @virtual_attribute = virtual_attr_value
end

したがって、私の例では、次のものが必要でした。

def hours_worked=(hours_worked_val)
  @hours_worked = hours_worked_val
end

アプリケーションと minitest の getter/setter テストの両方が、期待どおりに動作するようになりました。

于 2015-08-17T14:54:25.663 に答える