對(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)給父類構(gòu)造傳參
/// </summary>
/// <param name="options"></param>
public EFCoreDbContext(DbContextOptions options):base(options)
{
}
// DbSet屬性
public DbSet<Blog> Blogs { get; set; }
}我們?cè)趧?chuàng)建一個(gè)方法,返回類型是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;
}最后編寫(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)給父類構(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();
// 查詢數(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è)試代碼,改為查詢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)文章
SQL Server 2008 R2:error 26 開(kāi)啟遠(yuǎn)程連接詳解
本篇文章小編為大家介紹,SQL Server 2008 R2:error 26 開(kāi)啟遠(yuǎn)程連接詳解。需要的朋友參考下2013-04-04
asp.net core項(xiàng)目授權(quán)流程詳解
本文詳細(xì)講解了asp.net core項(xiàng)目的授權(quán)流程,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
Automation服務(wù)器不能創(chuàng)建對(duì)象的多種解決辦法
這篇文章主要介紹了Automation服務(wù)器不能創(chuàng)建對(duì)象的多種解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
.NET C#創(chuàng)建WebService服務(wù)簡(jiǎn)單實(shí)例
這篇文章主要為大家詳細(xì)介紹了.NET C# 創(chuàng)建WebService服務(wù)簡(jiǎn)單實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的方法介紹
這篇文章主要給大家介紹了關(guān)于ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
使用asp.net的pageDataSource中時(shí)索引問(wèn)題解決方法
當(dāng)前頁(yè)面在數(shù)據(jù)的除第一頁(yè)的任何一個(gè)頁(yè)面時(shí),重新條件查詢并且是新條件的總頁(yè)數(shù)小于剛才查詢得到的頁(yè)碼時(shí),就會(huì)出現(xiàn)“索引 20 不是為負(fù)數(shù),就是大于行數(shù)”的類似的錯(cuò)誤2013-04-04
TreeView無(wú)刷新獲取text及value實(shí)現(xiàn)代碼
這篇文章介紹了TreeView無(wú)刷新獲取text及value實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-10-10
如何使用.NET Core 選項(xiàng)模式【Options】
這篇文章主要介紹了如何使用.NET Core 選項(xiàng)模式,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07

