我在我的应用程序中有一个数据访问层,它包装了一个 ADO.NET 数据提供程序。DAL 将数据提供程序返回的数据转换为 .NET 对象。我看到很多帖子建议不要对 DAL 进行单元测试,但是这让我担心,在其中可能会出现很多问题——有很多循环、强制类型转换和空值检查。
我考虑过使用 RhinoMocks 创建模拟 DbProvider,但是每个测试中需要模拟的接口数量太多,而且需要设置的期望数会使测试非常难以阅读。似乎每个测试都比它所测试的代码更加复杂——这从单元测试的三个目标的角度来看是一场灾难:
1. 可读性 2. 可维护性 3. 可信度
我想到了实现一个友好的 DbProviderFactory 以从 xml 中加载示例数据。我可以通过依赖注入将其插入到测试中。这应该能够使测试更加简单易于维护。一个微不足道的例子可能是:
我认为使用友好的DbProvider这种方法可能会使测试DAL代码变得更容易。它将具有以下优点:
谢谢
我考虑过使用 RhinoMocks 创建模拟 DbProvider,但是每个测试中需要模拟的接口数量太多,而且需要设置的期望数会使测试非常难以阅读。似乎每个测试都比它所测试的代码更加复杂——这从单元测试的三个目标的角度来看是一场灾难:
1. 可读性 2. 可维护性 3. 可信度
我想到了实现一个友好的 DbProviderFactory 以从 xml 中加载示例数据。我可以通过依赖注入将其插入到测试中。这应该能够使测试更加简单易于维护。一个微不足道的例子可能是:
[TestCase]
public void CanGetCustomer()
{
var expectedCommand = new XmlCommand("sp_get_customer");
expectedCommand.ExpectExecuteDataReader(
resultSet: @"<customer firstName=""Joe"" lastName=""Blogs"" ... />");
var factory = new XmlProviderFactory(expectedCommand);
var dal = new CustomerDal(factory);
Customer customer = dal.GetCustomer();
Assert.IsNotNull(customer, "The customer should never be null");
Assert.AreEqual(
"Joe", customer.FirstName,
"The customer had an unexpected FirstName.");
}
我认为使用友好的DbProvider这种方法可能会使测试DAL代码变得更容易。它将具有以下优点:
- 测试数据将以xml格式存在,并且可以与单元测试一起放入源代码控制中。它可以在外部文件中或测试中内联。
- 我没有使用真实数据库,因此消除了状态问题。因此,我不必在每个测试之前将数据库置于已知状态。
- 我不必在每个测试中模拟所有ADO.NET接口。我将编写一组虚假实现,可在整个代码库中重复使用。
谢谢