對Entity?Framework?Core進行單元測試
一、引言
我們先來講解如何對EntityFrameworkCore進行單元測試,這里我們使用內(nèi)存數(shù)據(jù)庫進行測試。使用內(nèi)存數(shù)據(jù)庫需要安裝Microsoft.EntityFrameworkCore.InMemory這個包。
二、創(chuàng)建測試項目
我們還是以上面文章中創(chuàng)建的項目為例,在解決方案中添加一個測試項目,這里選擇使用xUnit作為測試項目:
創(chuàng)建完成后的項目結(jié)構(gòu)如下圖所示:
我們首先在EFCoreTest項目中安裝Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.InMemory這兩個包,直接在NuGet里面安裝即可,這里不在描述安裝步驟。添加完成以后添加對實體的引用。
我們創(chuàng)建數(shù)據(jù)上下文,繼承自DbContext:
/// <summary> /// 數(shù)據(jù)上下文,繼承自DbContext /// </summary> public class EFCoreDbContext:DbContext { /// <summary> /// 通過DbContextOptions選項給父類構(gòu)造傳參 /// </summary> /// <param name="options"></param> public EFCoreDbContext(DbContextOptions options):base(options) { } // DbSet屬性 public DbSet<Blog> Blogs { get; set; } }
我們在創(chuàng)建一個方法,返回類型是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> /// 數(shù)據(jù)上下文,繼承自DbContext /// </summary> public class EFCoreDbContext:DbContext { /// <summary> /// 通過DbContextOptions選項給父類構(gòu)造傳參 /// </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); // 添加數(shù)據(jù) context.Blogs.Add(new Blog() { Name = "ef core" }); // 保存 context.SaveChanges(); // 查詢數(shù)據(jù) var blog = await context.Blogs.FirstOrDefaultAsync(p => p.Id == 1); // 斷言 Assert.NotNull(blog); } } }
在測試方法上面右鍵,選擇“Live Unit Testing”,這個是實時的,我們可以在輸出窗口里面看到實時的信息:
啟動測試,在輸出窗口查看測試結(jié)果:
可以看到測試代碼前面都打勾了,表示測試通過。我們修改測試代碼,改為查詢id為2的數(shù)據(jù):
因為我們只添加了一條數(shù)據(jù),沒有id為2的那條數(shù)據(jù),所以測試報錯了。
到此為止,我們就完成了一個簡單的單元測試。
到此這篇關(guān)于對Entity Framework Core進行單元測試的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Asp.Net Core 2.1+的視圖緩存(響應緩存)
本篇文章給大家通過實例講述了Asp.Net Core 2.1+的視圖緩存(響應緩存)的相關(guān)知識點,對此有興趣的讀者們可以學習下。2018-03-03asp.net下利用JS實現(xiàn)對后臺CS代碼的調(diào)用方法
asp.net下利用JS實現(xiàn)對后臺CS代碼的調(diào)用方法...2007-04-04.Net插件框架Managed Extensibility Framework簡介
這篇文章介紹了.Net插件框架Managed Extensibility Framework,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07給Asp.Net初學者的關(guān)于繼承和多態(tài)性的例子
給Asp.Net初學者的關(guān)于繼承和多態(tài)性的例子...2006-09-09ABP引入SqlSugar框架的簡單版創(chuàng)建使用
這篇文章主要為大家介紹了ABP引入SqlSugar框架的簡單版創(chuàng)建使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04GridView中動態(tài)設置CommandField是否可用或可見的小例子
GridView中動態(tài)設置CommandField是否可用或可見的小例子,需要的朋友可以參考一下2013-05-05ASP.NET、SharePoint中另存文件的長文件名被截斷的原因及解決辦法
這個問題起初發(fā)生在SharePoint的環(huán)境中,我以為是SharePoint限制了長度,后來我試驗了一下,在ASP.NET的應用中也同樣會發(fā)生。2009-11-11