私はRSpecテストに問題があります。前のブロックで明示的にsubjectを使用していると思われます。特に、has_many/belongs_to関係を持つActiveRecordオブジェクトをテストしています。私は子供を追加することに基づいて、いくつかの簡単なロジックを持っている私の親モデルでこのRSpecセットアップで間違ったオブジェクトがテストされるのはなぜですか?
subject { FactoryGirl.create(:parent) }
let(:child) { FactoryGirl.build(:child) }
context "with added child object" do
before { subject.children << child }
its(:foo) { is.expected_to eq("bar")
end
:これは私が親が子を追加するイベントに基づいて、いくつかの行動を持っていることを主張しようとしているここで、私の失敗のテストを、ありますテストの外で動作するレコード。
before do
puts "subject is #{subject}"
puts "child is #{child}"
subject.children << child
puts "#{child} is now attached to #{child.parent}"
end
it "has the correct response" do
puts "testing against subject #{subject}"
expect(subject.foo).to eq("bar")
end
そして、私が得た出力は奇妙な何かが起こっていることを示唆している - 対象Iこと:それはテストでは動作しませんので、私は試してみて、理由を理解することは、長い形式の仕様の一部を書き出すに切り替え子供には、セットアップとテストブロックで1から
異なるもので添付: subject is #<Parent:0x00561eddf1a7a0>
child is #<Child:0x00561edcdd7fb0>
#<Child:0x00561edcdd7fb0> is now attached to #<Parent:0x00561edd11c040>
testing against subject #<Parent:0x00561eddf1a7a0>
私はこのような現象を発生させる対象と間違って何かをやっていますか?このテストを書く良い方法はありますか?
私はこのようなテストを構築する場合、それが通過すると、出力は親のいずれかの謎番目のバージョンが含まれていない以下の提案に基づいて
更新。
before do
child = FactoryGirl.create(:child, parent: parent)
end
it "has the correct response" do
# some puts to check the states of the various models here
expect(subject.foo).to eq("bar")
end
しかし、これは、クライアントがクラスを使用しているかではない - それは、多数の異なる方法を通じて子供たちを追加することが可能だ、と私はモデルに関係なく、同じように動作したいと思います。
これも質問には答えません。最初の設定では余分なオブジェクトはどこにありますか?
実際にテストしているものが得られませんか? fooメソッドは子供たちと何かをしますか?親に子を追加しても、その子は対象になりません。被験者は依然として親であり、何が起こるかは私が予想していることです。 –
@dexx私は、子が追加されたときに発生するイベントに基づいて、親メソッドのいずれかの動作をテストしています。私は主題がまだ親であることを望む。 テストで作成された2番目の親オブジェクトが子が添付されることが予想されるのはなぜですか?あるいは、私はその質問を強調するのに十分なものではなかったかもしれません。 – simple
私は今問題を見て、私は被験者を見ていて被験者に対するテストをしていました。子供のために工場には何が入っていますか? 'child_to_attach'はタイプミスですか?または別のレット/メソッド? –