幾個星期前,我跳上了MEF(ComponentModel)的潮流,現在我已經將它用於很多插件和共享庫。總的來說,除了我經常犯的錯誤之外,這很好,這導致調試會話令人沮喪。MEF和使用NUnit的單元測試
無論如何,我的應用程序運行良好,但是與MEF相關的代碼更改導致我的自動構建失敗。我的大部分單元測試都失敗了,因爲我測試的模塊依賴於需要由MEF加載的其他模塊。我通過繞過MEF並直接實例化這些對象來解決這些情況。
換句話說,通過MEF我會像
[Import]
public ICandyInterface ci { get; set; }
和
[Export(typeof(ICandyInterface))]
public class MyCandy : ICandyInterface
{
[ImportingConstructor]
public MyCandy([Import("name_param")] string name) {}
...
}
但在我的單元測試,我只想用
CandyInterface MyCandy = new CandyInterface("Godiva");
此外, CandyInterface需要連接到一個數據庫,我剛剛通過添加一個測試數據庫來解決這個問題到我的單元測試文件夾,我有NUnit用於所有的測試。
好了,這裏是我對於這種情況下的問題:
- 這是一個糟糕的方式來做事?
- 你會在[SetUp]
- 中推薦組成部分我還沒有學會如何在單元測試中使用mock - 這是一個很好的例子,我可能想要模擬底層的數據庫連接)只是返回虛擬數據,而不是真的需要數據庫?
- 如果您之前遇到類似的情況,您能提供您的經驗和解決問題的方式嗎? (或者這應該進入社區維基?)
這是一些非常好的建議,馬克。非常感謝您的意見! – Dave 2010-05-18 13:23:51
我看過你發佈的文章,而且內容非常豐富。所以這聽起來像我目前的測試,創建SQLite依賴對象應該有另一個ICandyInterface測試存根(或模擬對象?我還沒有看到差異),只是返回任何數據,我希望從數據庫中獲得,沒有實際上使用數據庫。 – Dave 2010-05-18 13:53:26
這聽起來正確,但:) – 2010-05-18 17:41:31