0

属性を更新するだけのメソッドがあります。:

@objects.each do |thingamabobber|
  thingamabobber.update_attributes( { attribute_one: false, attribute_two: true } )
end

それはもう少し行いますが、ほとんどの場合、それだけです。その更新部分の前と後にデバッガーを配置します。また、Unit :: Testの実行中に、属性が更新されないことに気付きました。

ただし、同じデバッガーでコードをコピーしてTest :: Unitコンソールに貼り付けるだけで、エラーなしで更新されます。これは、Railsコンソールを使用する場合、またはアプリ全体を使用する場合に当てはまります。すべてが正常に動作します。テストを除いて。

私のテストオブジェクトには何もスタブされていないことに注意してください。Factorygirlを使用してオブジェクトを作成しています。

さらに、テストでデバッガーをスローし、更新している属性でコレクションを実行すると、それらは変更されずに返されますが、それでもテストに合格します。つまり、attribute_oneを確認する1つのテストを除きます。が更新されます。

これは、.. Test :: Unitがデータをサイレントに処理しており、データが失敗していることを示していますが、理由のいずれかが原因ではありません。

誰かがこれが何の症状であるか知っていますか?

アップデート

これが本当に単純化されたものです:

should "update all items" do
  @item.items.last.update_all_recurring_items( {"name" => 'Ooooohhhh Yeeeeeea! Kooolaid Goooooood!'} )
  assert_equal @item.name, @item.items.last.name
end

次に、私のモデルのメソッド:

def update_all_recurring_items params = {}
  parent = self.recurring_items.present? ? self : Item.find(self.recurring_item_id)
  parent.recurring_items.each do |item|
    # Everything ok up to here. If I run the below method it works.
    item.update_attributes( params )
    # But! The Test Suit just skips over this like nothing ever happened.
  end
  parent.update_attributes(params) if self != parent
end
4

1 に答える 1

0

答えは、テストでオブジェクトをインスタンス化するようにオブジェクトをリロードすることであることに気付きました。

だから単にこれを行う:

@object.reload

すべてのテストに合格し、コンソールがTest::Unitの変更を反映できるようにしました。

でも、なぜそうなのか気になります。

于 2012-08-14T11:21:49.927 に答える