0

1 つ以上の新しい ActiveRecord オブジェクトを作成し、それらを配列として返すメソッドがあります。

class Parent < ActiveRecord::Base

  has_many :children

  def build_children
    5.times do |i|
      Child.create
    end
    return children
  end

end

ユーザーが誤って 2 回呼び出したというコーナー ケースの仕様を書いているときにbuild_children、期待どおりに失敗しないことに気付きました。

# passes
it "should return the previous batch of children if build_children called twice" do
  parent = Parent.create
  children = parent.build_children
  more_children = parent.build_children
  children.should == more_children
end

最初の呼び出しで 5 つの Children の配列を返し、2 番目の呼び出しで 10 の配列を返し、これは失敗すると思いました。代わりに、両方とも元の 5 を返します。

リロードを追加しても、失敗することはありません! 実際、失敗したように見える唯一の方法は、リロード後に返された配列に何らかの方法でアクセスすることです。

# this fails, as expected
it "should return the previous batch of children if build_children called twice" do
  parent = Parent.create
  children = parent.build_children
  parent.reload
  puts children
  more_children = parent.build_children
  children.should == more_children
end

さらに紛らわしいことに、この一連のコマンドはコンソールで期待どおりに機能します。

  parent = Parent.create
  children = parent.build_children
  parent.reload
  more_children = parent.build_children
  # => [ array of 10 children ]

rspecreloadサンプル グループ内では動作が異なりますか? インスタンス化された AR オブジェクトにアクセスすることの何が特別なのですか?

4

0 に答える 0