2011-09-30 128 views
0

當在我的節目,我有我可以簡化到一個情況如下:改變假庫進行單元測試使用依賴注入

  • 的IRepository其中我創建了一個MemoryRepository和SqlRepository實施
  • 一映射器,它獲得注入的IRepository構造函數。
  • 包含業務邏輯
  • 甲Mapper.Map()我想測試

我創建其中映射器接收所述MemoryRepository測試。 通過顯式設置將在業務邏輯中使用的內存存儲庫的屬性,我現在可以測試此邏輯。 但是,如果我使用注射,我將無法再訪問此存儲庫。

一段代碼告訴你更多的是1000個正常字,here is the pastebin link

你會怎麼做呢?

+1

@nathan:如果你感到強烈的代碼在後正在而不是在一個單獨的糊箱,你能不能再這麼好心來修復停工了呢? –

+0

把這個回覆到原來的樣子,對不起,如果我沒有得到正確的原文。 –

回答

1

如果我理解你的問題正確地基本上你擔心你的資料庫創建並注射時的測試類實例化,因此在您的測試方法,你不能修改版本庫的狀態,因爲它已經是在你的映射器中,當然,你的映射器不應該公開倉庫的內部。

如果是這樣的話,我認爲你不必擔心,只需修改myMemoryCategoryRepository的狀態並執行映射器的方法即可。您的映射器應該相應地執行操作,因爲您注入的內容是對存儲庫的引用,因此映射器內的對象與您將要修改的對象相同。

Dim myMemoryCategoryRepository As MemoryCategoryRepository = MemoryKernel.Instance.Get(Of MemoryCategoryRepository)() 
Dim myCategoryMapper As CategoryMapper = New CategoryMapper(myMemoryCategoryRepository) 

<TestMethod()> _ 
    Public Sub GetCategoryStartDate_CategoryStartDateAndContractStartDate_ContractStartDateIsOldestDate() 

    myMemoryCategoryRepository.AnyFlag = True 
    myCategoryMapper.Execute() 
    Assert.AreEqual(expectedValue, myCategoryMapper.Value) 
End Sub 
1

不完全確定你在問什麼,你在測試映射器還是存儲庫?如果您正在測試映射器,則僞造存儲庫。您已經獲得了接縫,可以使用框架或在測試中手動創建假庫,以便爲了測試Mapper而創建任何令人鼓舞的噪音,並通過將假構造函數傳遞給構造函數來創建該映射器。

因此,通過自己的簡化,

  • 創建一個假的庫從IRepository
  • 繼承
  • 注入假到您的映射,你要測試
  • 測試Mapper.Map()

如果您需要驗證存儲庫中的某些信息,請使用Mock而不是Stub。

Difference Between Mocks and Stubs