gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:01:38 25 4
gpt4 key购买 nike

我正在使用 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 和 EnsureCreatedEnsureDeleted 返回 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com