我使用的存储库的图案和具有真实由所讨论的单元测试实例化的虚拟库,它提供了一个已知的数据集,它包括一个例子是内和超出范围的各种字段。
这意味着,我可以测试我的代码通过从测试单元提供实例化的储存库进行测试或在运行时产生存储库(经由依赖注入(城堡))不变。
我不知道这一个良好的网络参考,但我从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