C# nUnit 测试失败,指出 SQL Server CE 约束实际上不存在
本文关键字:CE Server 约束 实际上 不存在 SQL 指出 nUnit 测试 失败 | 更新日期: 2023-09-27 18:35:23
几天来我一直在试图解决这个问题,我的公司似乎没有人能够帮助我,所以,这是我面临的有趣问题。
我们有一个包含大约 6500 个单元测试的测试套件,其中 650 个与我们如何与 SQL Server 和 SQL Server CE 3.5 数据库进行交互有关。SQL Server CE数据库只是一个本地模式/平面文件.sdf
。测试正在使用Resharper/CodeRush插件运行。
现在,除了一个带有SQL Server CE的单元测试之外,所有单元测试都已通过 - 我正在尝试更改一个表以从下表中删除 2 列:
CREATE TABLE Entity
(
Id UNIQUEIDENTIFIER PRIMARY KEY,
Name NVARCHAR(256) NOT NULL,
SerialNumber NVARCHAR(64) NOT NULL,
EquipmentType NVARCHAR(24) NULL,
EntityInformationDate DATETIME NULL,
EntityFamily INT NOT NULL
CONSTRAINT DF_Entity_EntityFamily DEFAULT(0)
)
现在,我正在运行的最新脚本在测试中崩溃但在生产中工作:
ALTER TABLE Entity DROP CONSTRAINT DF_Entity_EntityFamily
ALTER TABLE Entity DROP COLUMN EntityFamily
ALTER TABLE Entity DROP COLUMN EquipmentType
测试引发的错误消息是
Common.Utils.DatabaseUpdateException : 失败的脚本是: ALTER TABLE 实体> DROP CONSTRAINT DF_Entity_EntityFamily
System.Data.SqlServerCe.SqlCeException
外键约束不存在。[ DF_Entity_EntityFamily ]
此更改的原因是我使用 Guids 创建了一个可能的实体家庭的新表,因此正在交换它。
到目前为止我尝试了什么:
我已经调试并逐步完成了在此特定单元测试期间正在运行的脚本,并且任何时候都不会在此表上调用任何其他内容,因此约束必须存在。
我试图控制台打印调试消息或 printf,但 nUnit 似乎吃掉了它们
我试图在执行过程中拦截和检查
.sdf
文件,但如果我在 CompactView 或 Linqpad 中打开它,它总是空的 - 这让我认为可能有一个模拟运行它而不是实际文件。即使文件访问日期在 Windows 资源管理器中正在更改。
是否存在某种测试同步或订单问题、线程或其他我应该寻找的问题?这真的让我挨打... :(
创建数据库连接对象的继承工厂的问题。
根据测试顺序,可以使用已创建的会话单一实例(将指向 SQL Server)进入测试套件的开始。然后,正在运行的测试仅针对SQL Server CE,它不会具有SQL Server的约束。当单独运行测试夹具时,单例为空,因此它将创建正确的连接。
现在我只是让它创建我每次都特别要求的连接。
编辑:仅供参考,当我们将分布在 5 个项目中的单元测试迁移到一个测试项目中时,会导致此问题。