一、引言
我們先來講解如何對EntityFrameworkCore進行單元測試,這里我們使用內存數據庫進行測試。使用內存數據庫需要安裝Microsoft.EntityFrameworkCore.InMemory這個包。
二、創建測試項目
我們還是以上面文章中創建的項目為例,在解決方案中添加一個測試項目,這里選擇使用xUnit作為測試項目:

創建完成后的項目結構如下圖所示:

我們首先在EFCoreTest項目中安裝Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.InMemory這兩個包,直接在NuGet里面安裝即可,這里不在描述安裝步驟。添加完成以后添加對實體的引用。
我們創建數據上下文,繼承自DbContext:
/// <summary> /// 數據上下文,繼承自DbContext /// </summary> public class EFCoreDbContext:DbContext { /// <summary> /// 通過DbContextOptions選項給父類構造傳參 /// </summary> /// <param name="options"></param> public EFCoreDbContext(DbContextOptions options):base(options) { } // DbSet屬性 public DbSet<Blog> Blogs { get; set; } }
我們在創建一個方法,返回類型是DbContextOptions類型:
public static DbContextOptions<EFCoreDbContext> CreateDbContextOptions(string databaseName) { var serviceProvider = new ServiceCollection(). AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); var builder = new DbContextOptionsBuilder<EFCoreDbContext>(); builder.UseInMemoryDatabase(databaseName) .UseInternalServiceProvider(serviceProvider); return builder.Options; }
最后編寫測試代碼,整體代碼如下:
using EFCore.Model; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; using Xunit; namespace EFCoreTest { /// <summary> /// 數據上下文,繼承自DbContext /// </summary> public class EFCoreDbContext:DbContext { /// <summary> /// 通過DbContextOptions選項給父類構造傳參 /// </summary> /// <param name="options"></param> public EFCoreDbContext(DbContextOptions options):base(options) { } // DbSet屬性 public DbSet<Blog> Blogs { get; set; } } public class UnitTest1 { public static DbContextOptions<EFCoreDbContext> CreateDbContextOptions(string databaseName) { var serviceProvider = new ServiceCollection(). AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); var builder = new DbContextOptionsBuilder<EFCoreDbContext>(); builder.UseInMemoryDatabase(databaseName) .UseInternalServiceProvider(serviceProvider); return builder.Options; } /// <summary> /// 測試方法,這里使用異步 /// </summary> [Fact] public async void Test1() { var options= CreateDbContextOptions("batabase"); var context = new EFCoreDbContext(options); // 添加數據 context.Blogs.Add(new Blog() { Name = "ef core" }); // 保存 context.SaveChanges(); // 查詢數據 var blog = await context.Blogs.FirstOrDefaultAsync(p => p.Id == 1); // 斷言 Assert.NotNull(blog); } } }
在測試方法上面右鍵,選擇“Live Unit Testing”,這個是實時的,我們可以在輸出窗口里面看到實時的信息:

啟動測試,在輸出窗口查看測試結果:

可以看到測試代碼前面都打勾了,表示測試通過。我們修改測試代碼,改為查詢id為2的數據:

因為我們只添加了一條數據,沒有id為2的那條數據,所以測試報錯了。
到此為止,我們就完成了一個簡單的單元測試。
