0

我們試圖單元測試依賴於實體框架4.1的代碼。我看過幾篇文章對POCO進行單元測試,但我們希望保留默認的EF管道,以便我們可以輕鬆使用EF Caching Wrapper使用FakeItEasy針對嵌套實體框架成員進行單元測試

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實際上確實被調用?

謝謝!

回答

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

現在,我想它應該工作。