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

时间:2016-02-19 05:44:59

标签: c# sql-server visual-studio unit-testing 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 Entity> DROP CONSTRAINT DF_Entity_EntityFamily

     

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

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

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

  • 我已经调试并逐步完成了在此特定单元测试期间运行的脚本,并且此表上没有任何其他调用,因此约束必须在那里。

  • 我试图控制打印调试消息或printf'但nUnit似乎吃了它们

  • 我试图在执行期间拦截并检查.sdf文件,但如果我在CompactView或Linqpad中打开它,它总是空的 - 这让我觉得可能有一个模拟运行这个实际文件。即使Windows资源管理器中的文件访问日期发生了变化。

是否存在某种测试同步或订单问题,线程或其他我应该寻找的问题?这真的让我挨打...... :(

1 个答案:

答案 0 :(得分:0)

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

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

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

编辑:仅仅是为了获取信息,当我们将分布在5个项目中的单元测试迁移到一个单独的测试项目中时,就会出现此问题。