使用 EF.Functions.Contains() 的单元测试方法

M.G*_*M.G 6 c# unit-testing entity-framework ef-core-2.2

我有一个方法,其中包含对EF.Functions.Contains. 现在我想使用 InMemory 数据库为此方法编写单元测试,但我立即收到以下异常System.InvalidOperationException : The 'Contains' method is not supported because the query has switched to client-evaluation.

我的方法看起来像这样

var attributeValues = Context.AssetAttributeValues
                                         .Include(a => a.AssetAttribute)
                                         .Include(a => a.Asset)
                                         .Where(i => EF.Functions.Contains(i.Value, searchString));
Run Code Online (Sandbox Code Playgroud)

我知道抛出此异常是因为与我的高效 SQL Server 实例相比,我的 InMemory 数据库上没有全文索引,但如何在 InMemory 数据库上获取相同的索引?

有什么办法可以解决这个异常吗?

Mil*_*nev 1

就像你说的,EF.Functions.Contains不能在 InMemory 数据库中使用。

解决方法是IsSqlServer()检查您是否正在针对 SQL Server 或 InMemory 提供程序运行。

if(Context.IsSqlServer())  
    return Context.AssetAttributeValues
                                         .Include(a => a.AssetAttribute)
                                         .Include(a => a.Asset)
                                         .Where(i => EF.Functions.Contains(i.Value, searchString));
else
    return Context.AssetAttributeValues
                                         .Include(a => a.AssetAttribute)
                                         .Include(a => a.Asset)
                                         .Where(i => i.Value.Contains(searchString));
Run Code Online (Sandbox Code Playgroud)

  • 编写代码以便该代码可以通过单元测试并不是一个好主意。因为那个测试证明了什么? (2认同)
  • @CodeCaster:我同意,这不是一个解决方案,只是问题中提出的问题的解决方法。事实上,通过这样做,您正在将未经测试的 if 块发送到生产环境。 (2认同)