0

私たちは、Entity Framework 4.1に依存する単体テストコードを作成しようとしています。私はPOCOに対してユニットテストを実装するいくつかの投稿を見てきましたが、私たちは簡単にEF Caching Wrapperを使用できるように、デフォルトのEF配管を保持したいと考えています。ネストされたEntity Frameworkメンバーに対するFakeItEasyによるユニットテスト

FakeItEasyはEFを除外しているようですが、何が起こったのかが問題になります。 FakeItEasyで自分のユニットテストに続い

public partial class Email 
{ 
    IMyEntities _dataContext; 

    public Email(IMyEntities myEntities) 
    { 
     _dataContext = myEntities; 
    } 
    public void SendEmails() 
    { 
     // ... code to send emails goes here... 
     _dataContext.Emails.AddObject(this); 
     _dataContext.SaveChanges(); 
    } 
} 

例えば、私は(EFデータベース・ウィザードの最初から自動生成されたコードであり、別の Email部分クラスがある)私のモデルでは、このコードを有します
var context = A.Fake<IMyEntities>(); 
var email = A.Fake<Email>(context); 
// ... code to configure email goes here ... 
email.SendEmails(); 

// this fails with a FakeItEasy.ExpectationException... 
A.CallTo(() => context.Email.AddObject(email)).MustHaveHappened(); 

ユニットテストで、context.Emails.AddObjectが実際に呼び出されたことをどのように知ることができますか?

ありがとうございました!

答えて

0

私は夢中ではないが、うまくいきます。子オブジェクトに対してAddObject()を呼び出す代わりに、データコンテキスト自体で非推奨のメソッドAddTo[Collection Name]()を呼び出すことができます。これは浅いメソッド呼び出しなので、FakeItEasyで簡単に評価できます。

私のコードは次のように変更:

public void SendEmails() 
{ 
    // ... code to send emails goes here... 
    _dataContext.AddToEmails(this); 
    _dataContext.SaveChanges(); 
} 

その後、私のユニットテストで:もちろん

A.CallTo(_dataContext).Where(m => m.Method.Name == "AddToEmails").MustHaveHappened(); 
A.CallTo(() => _dataContext.SaveChanges()).MustHaveHappened(); 

、これを行うことにより、あなたは常に優先を無視しての欠点を持っている、非は非推奨、データコンテキストのコレクションに追加するたびにメソッドを呼び出すことができます。もちろん、子オブジェクトのメソッドの実行を決定する必要があるため、後でうまくいく可能性があります。

誰かがより良い方法を知っているなら、共有してください!

エリック

1

、ありがとうあなたは偽物にごコンテキストの電子メール・プロパティを設定する必要があります。

var context = A.Fake<IMyEntities>(); 
var mail = A.Fake<WhateverTypeTheEmailPropertyHas>(); 
A.CallTo(() => context.Email).Returns(mail); 

var email = A.Fake<Email>(context); 
// ... code to configure email goes here ... 
email.SendEmails(); 

// this fails with a FakeItEasy.ExpectationException... 
A.CallTo(() => mail.AddObject(email)).MustHaveHappened(); 

は今、私はそれが動作する必要がありますね。

関連する問題