我在我的數據訪問層中執行映射的方法。該方法接受DataReader,並將數據映射到適當的域對象屬性。有沒有一種很好的方式來模擬DataReader,這樣我就可以對映射方法執行單元測試而不會碰撞物理數據庫?如何將DataReader模擬爲單元測試DAL
6
A
回答
11
幸運的是,DataReader
實現了IDataReader
接口。
代替依靠代碼中的DataReader
,請使用IDataReader
。然後,在您的測試中,您可以替換您自己的實現來返回虛擬數據,或使用模擬框架(如Rhino.Mocks或類似)來創建存根並分配返回值。
根據你在代碼中「獲得」DataReader
的方式,你可能需要做一些重構。你想要的是在構造函數(首選)或通過屬性中「注入」這樣的外部依賴項,以便該類的消費者可以替換IDataReader
的任何實現。 (這種替換也是爲什麼你聲明你的參數/屬性爲抽象而不是具體類型。)這被稱爲Dependency Injection,一種形式Inversion of Control。
3
是的,不要使用DataReader
,但IDataReader或IDataRecord,然後嘲笑任何你想要的。
3
如果您想模擬IDataReader返回記錄列表,您可以創建一個實現IDataReader並覆蓋其一些方法(如Read()和Indexer)的類。另外,您需要一個變量來保存當前行的記錄和保存列表值的變量。下面是這樣做的示例代碼:
public class MockDataReader : IDataReader
{
private int _rowCounter = 0;
private List<Dictionary<string,object>> _records = new List<Dictionary<string,object>>();
public MockDataReader(List<Dictionary<string,object>> records)
{
_records = records;
}
public bool Read()
{
_rowCounter++;
if (_rowCounter < _records.Count) return true;
return false;
}
public object this[string name]
{
get { return _records[_rowCounter][name]; }
}
}
然後利用這一類的,你可以使用下面的代碼:
var itemsList = new List<Dictionary<string, object>>();
for (int i = 0; i < 5; i++)
{
var num = i + 1;
var items = new Dictionary<string, object>();
items.Add("Id", num);
items.Add("FirstName", "MyFirstName" + num);
items.Add("LastName", "MyLastName" + num);
itemsList.Add(items);
}
var result = new MockDataReader(itemsList);
不是一個完整的證明方式,但工程。希望它有助於:)
相關問題
- 1. 模擬DataReader for Windows Store單元測試項目
- 2. 如何單元測試/模擬requests.get(URL)
- 3. 單元測試如何模擬Cookie
- 4. 我如何單元測試/模擬ElasticSearch
- 5. 模擬單元測試
- 6. 單元測試:模擬BundleTable.Bundles
- 7. 單元測試模擬法
- 8. 單元測試和模擬
- 9. 單元測試模擬Url.Action
- 10. 單元測試模擬HttpActionContext
- 11. 模擬@ org.jboss.seam.annotations.in行爲單元測試
- 12. 爲單元測試模擬SSL HttpRequest
- 13. 單元測試DAL - 停止運行單元測試時連接
- 14. EF,DAL門面和單元測試
- 15. 單元測試DAL - 請批評
- 16. Phalcon - 模擬單元測試模型
- 17. 如何爲單元測試模擬/覆蓋只讀字段
- 18. 如何爲ng2單元測試模擬ng2-restangular?
- 19. 如何爲單元測試一個服務模擬一個entityManager
- 20. 如何在android中爲單元測試模擬MotionEvent和SensorEvent?
- 21. 如何定義模擬光標爲Android單元測試
- 22. 如何爲單元測試模擬/創建X509Certificate2?
- 23. 將Doctrine實體轉換爲單元測試的模擬
- 24. 模擬DAL的單元測試方法,但底層方法調用不同(真實)DAL
- 25. 你如何測試DAL?
- 26. 單元測試用存根和模擬
- 27. 單元測試的模擬DLL方法
- 28. UAC模擬和單元測試
- 29. CakePHP單元測試模擬控制器
- 30. 模擬Grails單元測試的方法
我不會創建實際的類來模擬'IDataReader',而是+1來顯示你需要設置你的模擬對象來實現。 – krillgar 2015-10-23 17:58:45