目前我正在使用 SqlCe 作为我的项目的数据库并使用 Sqlite 进行单元测试,因为它很简单(例如允许使用 Inmemory)。我只是想知道,将来这可能会导致争议或奇怪吗?
1 回答
如果在单元测试中使用不同的持久性机制会导致问题,那么问题可能是由以下原因引起的:
- 你的单元测试
- 您的一般应用程序架构
您为对象编写的测试不应依赖于它们的依赖项的实现方式,这样做会自动意味着您的单元测试变成集成测试。
你应该使用Persistence Ignorance的概念来设计你的对象,这意味着它们的实现方式使得它们的实现不依赖于底层数据源的实现方式。在企业应用程序内部实现 PI 的常用方法是使用存储库模式。这抽象了您的对象用于从数据源本身的底层实现访问数据源的接口。这意味着,理论上,您可以为不同的数据源创建新的提供者,而无需更改依赖于它们的对象的实现。
例如:
假设您有一个名为的实体Customer
,您将其保存在 SqlCe 数据库中。您可以创建一个名为的接口,该接口ICustomerRepository
由SqlCeCustomerRepository
您在主应用程序内部使用的 a 实现。这样,在您的单元测试中,SqlLiteCustomerRepository
如果您发现这是一种创建模拟数据源的简单方法,您可以将其换成 a。为了让事情变得更简单,您可以创建一个在后台InMemoryCustomerRepository
使用List<T>
的对象来存储和检索您的对象。关键是如何实现数据源并不重要,只要它符合您在存储库接口上设置的合同。
这种模式的好处也超越了单元测试,并延伸到应用程序的一般维护中。假设您想扩展您的体系结构并使用 SQL Server 而不是 SQL CE,使用诸如存储库之类的抽象将有助于限制系统中为实现这一目标所需的更改量,从而减少开发时间,减少错误,和更快乐的客户。