在SQL Server上进行集成测试,设置测试db

时间:2018-02-16 15:03:49

标签: asp.net entity-framework integration-testing

我使用实体框架在asp.net中开发,我尝试在DB上进行一些集成测试。我使用SQL Server Express,我没有这么多经验。即使我在每次测试后都会使用回滚,我想确保在所有测试运行之前我的测试数据库始终为空。什么是最佳做法?

在一个Pluralsight video作者中,在这样的测试之前删除db文件:

private static void DestroyDatabase()
{
    var fileNames = ExecuteSqlQuery(Master, @"
        SELECT [physical_name] FROM [sys].[master_files]
        WHERE [database_id] = DB_ID('Globalmantics')",
        row => (string)row["physical_name"]);

    if (fileNames.Any())
    {
        ExecuteSqlCommand(Master, @"
            ALTER DATABASE [Globalmantics] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
            EXEC sp_detach_db 'Globalmantics'");

        fileNames.ForEach(File.Delete);
    }
}

之后他又创建了db。我很奇怪他为什么不使用sql命令 drop database 而不是删除文件?也许 drop database 可能与实体框架有关吗?

如果db使用文件流怎么办?如果我没有错,则在创建新数据库后手动设置文件流是必要的。到目前为止,我发现我只能删除表,并使用这样的文件流保留空数据库:

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec sp_executesql @Sql
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO

EXEC sp_MSforeachtable 'DROP TABLE ?'
GO

0 个答案:

没有答案