C# nUnit 测试失败说 SQL 服务器 CE 约束实际上不存在
C# nUnit test failing saying SQL Server CE constraint doesn't exist when it actually does
几天来我一直在努力解决这个问题,我公司似乎没有人能够帮助我,所以,这就是我面临的有趣问题。
我们有一个包含大约 6500 个单元测试的测试套件,其中 650 个与我们如何与 SQL Server 和 SQL Server CE 3.5 数据库交互有关。 SQL 服务器 CE 数据库只是一个本地模式/平面文件 .sdf
。正在使用 Resharper / CodeRush 插件进行测试 运行。
现在,所有的单元测试都通过了,除了 SQL Server CE 的单元测试之外-我正在尝试更改 table 以从以下 table 中删除 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)
)
现在,我正在 运行ning 的最新脚本在测试中崩溃 但在生产中有效:
ALTER TABLE Entity DROP CONSTRAINT DF_Entity_EntityFamily
ALTER TABLE Entity DROP COLUMN EntityFamily
ALTER TABLE Entity DROP COLUMN EquipmentType
测试抛出的错误信息是
Common.Utils.DatabaseUpdateException : Failing script is: ALTER TABLE Entity > DROP CONSTRAINT DF_Entity_EntityFamily
System.Data.SqlServerCe.SqlCeException
The foreign key constraint does not exist. [ DF_Entity_EntityFamily ]
此更改的原因是我使用 Guid 创建了一个新的 table 可能的 EntityFamily,所以我正在交换它。
到目前为止我尝试了什么:
在这个特定的单元测试期间,我已经调试并逐步完成了 运行 正在执行的脚本,并且在这个 table 上没有任何其他调用,所以约束必须在那里。
我曾尝试控制打印调试消息或 printf,但 nUnit 似乎吃掉了它们
我试图在执行过程中拦截和检查 .sdf
文件,但如果我在 CompactView 或 Linqpad 中打开它,它总是空的——这让我觉得可能有一个模拟 运行ning 这个而不是实际的文件。即使文件访问日期在 windows 资源管理器中发生变化。
是否存在我应该寻找的某种测试同步或顺序问题、线程或其他问题?这真的把我打败了... :(
原来是创建数据库连接对象的继承工厂有问题。
根据测试顺序,可以使用已创建的会话单例进入测试套件的开始,它将指向 SQL 服务器。然后,运行 的测试仅针对 SQL Server CE,它没有 SQL Server 的约束。 运行单独连接测试夹具时,单例为空,因此它将创建正确的连接。
现在我只是让它创建我每次都特别要求的连接。
编辑:仅供参考,当我们将分布在 5 个项目中的单元测试迁移到一个测试项目中时,发现这个问题是造成的。
几天来我一直在努力解决这个问题,我公司似乎没有人能够帮助我,所以,这就是我面临的有趣问题。
我们有一个包含大约 6500 个单元测试的测试套件,其中 650 个与我们如何与 SQL Server 和 SQL Server CE 3.5 数据库交互有关。 SQL 服务器 CE 数据库只是一个本地模式/平面文件 .sdf
。正在使用 Resharper / CodeRush 插件进行测试 运行。
现在,所有的单元测试都通过了,除了 SQL Server CE 的单元测试之外-我正在尝试更改 table 以从以下 table 中删除 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)
)
现在,我正在 运行ning 的最新脚本在测试中崩溃 但在生产中有效:
ALTER TABLE Entity DROP CONSTRAINT DF_Entity_EntityFamily
ALTER TABLE Entity DROP COLUMN EntityFamily
ALTER TABLE Entity DROP COLUMN EquipmentType
测试抛出的错误信息是
Common.Utils.DatabaseUpdateException : Failing script is: ALTER TABLE Entity > DROP CONSTRAINT DF_Entity_EntityFamily
System.Data.SqlServerCe.SqlCeException
The foreign key constraint does not exist. [ DF_Entity_EntityFamily ]
此更改的原因是我使用 Guid 创建了一个新的 table 可能的 EntityFamily,所以我正在交换它。
到目前为止我尝试了什么:
在这个特定的单元测试期间,我已经调试并逐步完成了 运行 正在执行的脚本,并且在这个 table 上没有任何其他调用,所以约束必须在那里。
我曾尝试控制打印调试消息或 printf,但 nUnit 似乎吃掉了它们
我试图在执行过程中拦截和检查
.sdf
文件,但如果我在 CompactView 或 Linqpad 中打开它,它总是空的——这让我觉得可能有一个模拟 运行ning 这个而不是实际的文件。即使文件访问日期在 windows 资源管理器中发生变化。
是否存在我应该寻找的某种测试同步或顺序问题、线程或其他问题?这真的把我打败了... :(
原来是创建数据库连接对象的继承工厂有问题。
根据测试顺序,可以使用已创建的会话单例进入测试套件的开始,它将指向 SQL 服务器。然后,运行 的测试仅针对 SQL Server CE,它没有 SQL Server 的约束。 运行单独连接测试夹具时,单例为空,因此它将创建正确的连接。
现在我只是让它创建我每次都特别要求的连接。
编辑:仅供参考,当我们将分布在 5 个项目中的单元测试迁移到一个测试项目中时,发现这个问题是造成的。