2016-11-01 5 views
0

私は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 

しかし、これは、クライアントがクラスを使用しているかではない - それは、多数の異なる方法を通じて子供たちを追加することが可能だ、と私はモデルに関係なく、同じように動作したいと思います。

これも質問には答えません。最初の設定では余分なオブジェクトはどこにありますか?

+0

実際にテストしているものが得られませんか? fooメソッドは子供たちと何かをしますか?親に子を追加しても、その子は対象になりません。被験者は依然として親であり、何が起こるかは私が予想していることです。 –

+0

@dexx私は、子が追加されたときに発生するイベントに基づいて、親メソッドのいずれかの動作をテストしています。私は主題がまだ親であることを望む。 テストで作成された2番目の親オブジェクトが子が添付されることが予想されるのはなぜですか?あるいは、私はその質問を強調するのに十分なものではなかったかもしれません。 – simple

+0

私は今問題を見て、私は被験者を見ていて被験者に対するテストをしていました。子供のために工場には何が入っていますか? 'child_to_attach'はタイプミスですか?または別のレット/メソッド? –

答えて

0

あなたはこのようにそれを試すことができます:子オブジェクトは、親との関係を持ってい

let(:parent) { FactoryGirl.create(:parent) } 
let(:child) { FactoryGirl.build(:child) } 
subject { parent } 

context "with added child object" do 
    before { parent.children << child } 
    its(:foo) { is.expected_to eq("bar") 
end 

場合や:

let!(:parent) { FactoryGirl.create(:parent) } 
let!(:child) { FactoryGirl.build(:child, parent: parent) } 
subject { parent } 

context "with added child object" do 
    its(:foo) { is.expected_to eq("bar") 
end 

は私が結果を知ってみましょう。

+0

最初の例では、バケット演算子を使用して割り当てますが、前と同じ動作になります。テストが失敗し、子が完全に異なる親で終わる(なぜわかりません)。 – simple

+0

2番目の例では、同じことです - 子を 'build'ではなく' create'しないと、テストは合格(!)し、子は正しく結び付けられます。そのバケット割り当てで何かが間違っているように見えますが、私は何がわかりません。 – simple

+0

'parent.children << child'の後に' parent.save! 'を実行する必要があるかもしれません –

関連する問題