【发布时间】:2020-07-15 08:08:03
【问题描述】:
我正在使用 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 db。
但是,当我尝试在 Azure 管道上构建解决方案时,它不会创建数据库,因为环境不同。我应该在执行测试的同一文件夹下创建 db,但是...
使用数据库位置的连接字符串:
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 会立即抛出异常:
抛出异常:'Microsoft.Data.SqlClient.SqlException' in
Microsoft.EntityFrameworkCore.Relational.dll
数据库“UnitTest”已经存在。选择一个不同的数据库名称。
和以前一样,EnsureDeleted 没有完成它的工作。
所有的麻烦都与在连接字符串中使用AttachDbFilename有关......
关于如何解决这个问题的任何想法,因为我的 Azure 版本不适用于此设置中的测试 :-)
谢谢 克森德拉
【问题讨论】:
-
@mvermef 如下所述,SQLite 不适用于一些用代码编写的查询,对于 EF Core InMemory,来自您提供的链接:EF Core 带有我们使用的内存数据库用于 EF Core 本身的内部测试。此数据库通常不适合测试使用 EF Core 的应用程序。
-
非常了解 sqlite 的功能。我只是添加文档来支持 MS 的建议
标签: azure unit-testing localdb entity-framework-core-3.1