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