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 オブジェクトにアクセスすることの何が特別なのですか?