C# nUnit 测试失败,表示 SQL Server CE 约束不存在,而实际上它确实存在



几天来我一直在试图解决这个问题,我的公司似乎没有人能够帮助我,所以,这是我面临的有趣问题。

我们有一个包含大约 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 个项目中的单元测试迁移到一个测试项目中时,会导致此问题。

最新更新