1

Entity Framework 4.1 に依存するコードの単体テストを試みています。POCO に対する単体テストを実装する投稿をいくつか見てきましたが、EF Caching Wrapperを簡単に使用できるように、デフォルトの EF 配管を保持したいと考えています。

FakeItEasy は EF の抽象化をうまく処理しているようですが、何が起こったのかを主張するのに問題があります。たとえば、モデルに次のコードがあります (ここにはEmail、EF データベース ファースト ウィザードから自動生成されたコードである別の部分クラスがあります)。

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();
    }
}

次に、FakeItEasy を使用した単体テストで:

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実際に呼び出された単体テストからどのように知ることができますか?

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

4

2 に答える 2

1

コンテキストの Email-property を偽物に設定する必要があります。

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();

今、私はそれがうまくいくはずだと思います。

于 2011-08-19T20:05:14.050 に答える
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();

もちろん、これを行うことで、データ コンテキストのコレクションに追加する必要があるときはいつでも、推奨される非推奨でないメソッドを常に無視するという欠点があります。言うまでもなく、子オブジェクトのメソッドの実行を決定する必要があり、後でつまずく可能性が高いです...

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

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

エリック

于 2011-08-14T17:10:19.557 に答える