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 约束实际上不存在的主要内容,如果未能解决你的问题,请参考以下文章
对 NUnit 测试使用 RunImpersonated 进行 HttpClient 调用失败,但在控制台中有效