C# nUnit 测试失败,说 SQL Server CE 约束实际上不存在

Posted

技术标签:

【中文标题】C# nUnit 测试失败,说 SQL Server CE 约束实际上不存在【英文标题】:C# nUnit test failing saying SQL Server CE constraint doesn't exist when it actually does 【发布时间】:2016-02-19 05:44:58 【问题描述】:

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

我们有一个包含大约 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 Entity > DROP CONSTRAINT DF_Entity_EntityFamily

System.Data.SqlServerCe.SqlCeException 外键约束不存在。 [DF_Entity_EntityFamily]

此更改的原因是我已经使用 Guids 创建了一个可能的 EntityFamily 的新表,所以我正在交换它。

到目前为止我尝试了什么:

我已经调试并逐步完成了在这个特定单元测试期间正在运行的脚本,并且在任何时候都没有在这个表上调用任何其他内容,因此必须存在约束。

我尝试控制台打印调试消息或 printf,但 nUnit 似乎吃掉了它们

我试图在执行期间拦截和检查.sdf 文件,但如果我在 CompactView 或 Linqpad 中打开它,它总是为空 - 这让我认为可能有一个模拟运行它而不是实际文件。即使 Windows 资源管理器中的文件访问日期正在更改。

是否有某种测试同步或顺序问题、线程问题或其他我应该寻找的问题?这真的让我被打败了...... :(

【问题讨论】:

您是否 100% 确定在您的测试数据库文件中存在该名称的约束? 有些测试,如果我不尝试删除它,它会说“无法删除列,因为它被引用 DF_Entity_EntityFamily 使用”所以我一定是在某个地方结束了。 如果我单独运行失败的测试 - 他们通过了...... 【参考方案1】:

原来是创建数据库连接对象的继承工厂有问题。

根据测试顺序,可以使用已创建的会话单例进入测试套件的开头,该会话单例将指向 SQL Server。然后,正在运行的测试只针对 SQL Server CE,它没有 SQL Server 所具有的约束。当单独运行测试夹具时,单例为空,因此它会创建正确的连接。

现在我只是让它创建我每次都特别要求的连接。

编辑:仅供参考,这个问题原来是当我们将分布在 5 个项目中的单元测试迁移到一个测试项目时引起的。

【讨论】:

以上是关于C# nUnit 测试失败,说 SQL Server CE 约束实际上不存在的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 为给定函数创建负 nunit 测试用例

vs2010中使用Nunit测试c#代码结果的正确性

(30)C#使用NUNIT单元测试

对 NUnit 测试使用 RunImpersonated 进行 HttpClient 调用失败,但在控制台中有效

C# - 单元测试 - 初始化私有字段 - ASP.NET Core 5 - NUnit 测试

通过 NUnit 运行 C++ 代码