我使用的存儲庫的圖案和具有真實由所討論的單元測試實例化的虛擬庫,它提供了一個已知的數據集,它包括一個例子是內和超出範圍的各種字段。
這意味着,我可以測試我的代碼通過從測試單元提供實例化的儲存庫進行測試或在運行時產生存儲庫(經由依賴注入(城堡))不變。
我不知道這一個良好的網絡參考,但我從Apress出版出版的史蒂芬·桑德森的專業ASP.NET MVC 1.0書中學到了很多。 MVC方法自然提供了讓您的測試在較少依賴性下運行所需的關注點分離。
的基本要素是,你儲存庫實現了數據訪問的接口,即同一個接口,然後通過您在測試項目中構建一個假的庫來實現。
在我目前的項目中,我有這樣的接口:
namespace myProject.Abstract
{
public interface ISeriesRepository
{
IQueryable<Series> Series { get; }
}
}
這是作爲我的兩個實時數據倉庫(使用LINQ to SQL),也是一個假的存儲庫這樣的:
namespace myProject.Tests.Respository
{
class FakeRepository : ISeriesRepository
{
private static IQueryable<Series> fakeSeries = new List<Series> {
new Series { id = 1, name = "Series1", openingDate = new DateTime(2001,1,1) },
new Series { id = 2, name = "Series2", openingDate = new DateTime(2002,1,30),
...
new Series { id = 10, name = "Series10", openingDate = new DateTime(2001,5,5)
}.AsQueryable();
public IQueryable<Series> Series
{
get { return fakeSeries; }
}
}
}
然後,消耗數據的類將實例化,並將庫引用傳遞給構造函數:
namespace myProject
{
public class SeriesProcessor
{
private ISeriesRepository seriesRepository;
public void SeriesProcessor(ISeriesRepository seriesRepository)
{
this.seriesRepository = seriesRepository;
}
public IQueryable<Series> GetCurrentSeries()
{
return from s in seriesRepository.Series
where s.openingDate.Date <= DateTime.Now.Date
select s;
}
}
}
然後在我的測試中,我可以這樣來解決:
namespace myProject.Tests
{
[TestClass]
public class SeriesTests
{
[TestMethod]
public void Meaningful_Test_Name()
{
// Arrange
SeriesProcessor processor = new SeriesProcessor(new FakeRepository());
// Act
IQueryable<Series> currentSeries = processor.GetCurrentSeries();
// Assert
Assert.AreEqual(currentSeries.Count(), 10);
}
}
}
然後看CastleWindsor的控制方法反轉爲您直播的項目,讓你的產品代碼,通過依賴注入自動實例化的活動資料庫。這應該讓你更接近你需要的地方。
聽起來像一個有趣的方法,但不知何故,我不完全理解它。你有沒有在網上提供這種方法的參考? – Michal 2009-07-09 03:02:59