使用SqlCe作为数据库并使用Sqlite进行单元测试

时间:2012-08-21 16:36:20

标签: sqlite unit-testing sql-server-ce

目前我正在使用SqlCe作为我的项目的数据库,并使用Sqlite进行单元测试,因为它的简单性(例如允许使用Inmemory)。我只是想知道,将来这可能导致争议或奇怪?

1 个答案:

答案 0 :(得分:4)

如果在单元测试中使用不同的持久性机制会导致问题,那么问题可能是由以下原因引起的:

  1. 您的单元测试
  2. 您的一般应用程序架构
  3. 您为对象编写的测试不应该依赖于实现其依赖项的任何方式,这样做会自动意味着您的单元测试变为集成测试。 / p>

    您应该使用Persistence Ignorance的概念设计对象,这意味着它们以这样的方式实现,以便它们的实现不依赖于底层数据源的实现方式。在企业应用程序内部实现PI的常用方法是使用the Repository Pattern。这抽象了对象用来从数据源本身的底层实现访问数据源的接口。这意味着,理论上,您可以为不同的数据源创建新的提供程序,而无需更改依赖于它们的对象的实现。

    例如:

    假设您有一个名为Customer的实体,您可以将其保存在SqlCe数据库中。您可以创建一个名为ICustomerRepository的接口,该接口由您在主应用程序中使用的SqlCeCustomerRepository实现。在单元测试中,如果您发现这是一种创建模拟数据源的简单方法,则可以将其替换为SqlLiteCustomerRepository。为了使事情变得更简单,您可以创建一个InMemoryCustomerRepository,使用List<T>来掩盖和检索您的对象。关键是如何实现数据源并不重要,只要它符合您在存储库界面上设置的合同。

    此模式的好处还超出了单元测试和应用程序的一般维护。假设您想扩展您的体系结构并使用SQL Server而不是SQL CE,使用诸如存储库之类的抽象将有助于限制系统中所需的更改量,以便实现此目的,从而减少开发时间,减少错误,以及更快乐的客户。