我已经试图解决这个问题已经好几天了,我公司似乎没有人能够帮助我,这就是我面临的有趣问题。
我们有一个大约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资源管理器中的文件访问日期发生了变化。
是否存在某种测试同步或订单问题,线程或其他我应该寻找的问题?这真的让我挨打...... :(
答案 0 :(得分:0)
原来是创建数据库连接对象的继承工厂存在问题。
根据测试顺序,可以使用已创建的Session Singleton输入测试套件的开头,这将指向SQL Server。然后,正在运行的测试仅针对SQL Server CE,它不具有SQL Server所具有的约束。当单独运行测试夹具时,单例为空,因此它将创建正确的连接。
现在我只是让它创建我每次都特别要求的连接。
编辑:仅仅是为了获取信息,当我们将分布在5个项目中的单元测试迁移到一个单独的测试项目中时,就会出现此问题。