azure - 使用 LocalDb 与 EF Core 项目 + Azure 管道进行单元测试

标签 azure unit-testing localdb entity-framework-core-3.1

我正在使用 localdb 进行单元测试。测试按一定顺序执行(不按顺序执行的测试预计会失败)。

过去,我尝试过 InMemory,但失败了,因为它不是关系型的,而 SQLite 失败了,因为我们的一些请求没有返回数据 ( List<Guid>().Contains(Guid) )

在执行测试之前,我有静态方法来设置测试环境。

localDb 的连接字符串:

private static string LocalDBConnection = "Server=(localdb)\\DbInstance;Database=UnitTest; Integrated security=True";

DbInstance使用 MartinCostelo.SlLocalDb... 创建

之后我创建服务提供商,并注册dbContext .

为了确保每次都有干净的启动,我在每次运行时删除并重新创建测试数据库:

        dbContext.Database.EnsureDeleted();
        dbContext.Database.EnsureCreated();

这段代码在办公室的每台计算机上都能完美执行。它在用户本地文件夹中创建 UnitTest 数据库。

但是,当我尝试在 Azure 管道上构建解决方案时,它不会创建数据库,因为环境不同。我应该在执行测试的同一文件夹下创建数据库,但是...

使用数据库位置的连接字符串:

private static string LocalDBConnection = "Server=(localdb)\\DbInstance;Database=UnitTest; Integrated security=True; AttachDBFilename=.\\UnitTest.mdf";

这应该在执行测试的同一位置创建数据库。

EF Core 执行 Ensuredeleted 和 EnsureCreated EnsureDeleted 返回 false(失败,但不会使事情变得复杂) EnsureCreated 转换为 SQL 如下:

CREATE DATABASE [UnitTest]
ON (NAME = N'UnitTest', FILENAME = N'C:\Dev\somefolders\bin\Debug\netcoreapp3.1\UnitTest.mdf')
LOG ON (NAME = N'UnitTest_log', FILENAME = N'C:\Dev\somefolders\bin\Debug\netcoreapp3.1\UnitTest_log.ldf');
Microsoft.EntityFrameworkCore.Database.Command: Information: Executed DbCommand (57ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
    ALTER DATABASE [UnitTest] SET READ_COMMITTED_SNAPSHOT ON;
END;

执行此操作会抛出 SqlException: 无法将文件“.\UnitTest.mdf”附加为数据库“UnitTest”。

更新:

EnsureCreated实际上创建了数据库(它在 SQL Server Management Studio 中可见),但它等待超时,然后抛出异常。

如果我停止测试执行并再次重新运行它(数据库存在于磁盘上),则 EnsureCreated立即抛出异常:

Exception thrown: 'Microsoft.Data.SqlClient.SqlException' in

Microsoft.EntityFrameworkCore.Relational.dll
Database 'UnitTest' already exists. Choose a different database name.

如前所述,EnsureDeleted没有尽到自己的职责。

所有的麻烦都与使用AttachDbFilename有关。在连接字符串中...

有关如何解决此问题的任何想法,因为我的 Azure 版本无法在此设置中进行测试:-)

谢谢 克曾德拉

最佳答案

建议使用SQLite in memory database用于集成测试 Entity Framework Core。您应该修复失败的测试,而不是使用 LocalDb。

示例:

    public class SqliteInMemoryItemsControllerTest : ItemsControllerTest, IDisposable
    {
        private readonly DbConnection _connection;

        public SqliteInMemoryItemsControllerTest()
            : base(
                new DbContextOptionsBuilder<ItemsContext>()
                    .UseSqlite(CreateInMemoryDatabase())
                    .Options)
        {
            _connection = RelationalOptionsExtension.Extract(ContextOptions).Connection;
        }

        private static DbConnection CreateInMemoryDatabase()
        {
            var connection = new SqliteConnection("Filename=:memory:");

            connection.Open();
            
            return connection;
        }

        public void Dispose() => _connection.Dispose();
    }

关于azure - 使用 LocalDb 与 EF Core 项目 + Azure 管道进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62910319/

相关文章:

asp.net - 如何使用 localDB 将 ASP.NET MVC 4 应用程序部署到 Windows 7 上的本地 IIS?

azure - 与 Azure 上托管的 Web 容器建立 https 连接

python - 自定义模型管理器方法的 Django 单元测试

unit-testing - 我怎样才能只开课来测试课?

vue.js - 我该如何解决 route.params is undefined?

sql-server - 客户端PC上的LocalDB部署

azure - 使用New-AzureRmDeployment和链接的ARM模板创建资源组和资源时如何获取资源组名称?

java - 如何使用 Azure CLI 为使用 ARM 模板新创建/更新的应用服务获取发布凭据

azure - 在 Azure 上的 Windows Server 2012 上部署时, key 集不存在异常

.net - SQL Server CE 和 Visual Studio 2013