對Entity?Framework?Core進(jìn)行單元測試
一、引言
我們先來講解如何對EntityFrameworkCore進(jìn)行單元測試,這里我們使用內(nèi)存數(shù)據(jù)庫進(jìn)行測試。使用內(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進(jìn)行單元測試的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SQL Server 2008 R2:error 26 開啟遠(yuǎn)程連接詳解
本篇文章小編為大家介紹,SQL Server 2008 R2:error 26 開啟遠(yuǎn)程連接詳解。需要的朋友參考下2013-04-04
Automation服務(wù)器不能創(chuàng)建對象的多種解決辦法
這篇文章主要介紹了Automation服務(wù)器不能創(chuàng)建對象的多種解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
.NET C#創(chuàng)建WebService服務(wù)簡單實例
這篇文章主要為大家詳細(xì)介紹了.NET C# 創(chuàng)建WebService服務(wù)簡單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
ASP.NET WebAPI2復(fù)雜請求跨域設(shè)置的方法介紹
這篇文章主要給大家介紹了關(guān)于ASP.NET WebAPI2復(fù)雜請求跨域設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
使用asp.net的pageDataSource中時索引問題解決方法
當(dāng)前頁面在數(shù)據(jù)的除第一頁的任何一個頁面時,重新條件查詢并且是新條件的總頁數(shù)小于剛才查詢得到的頁碼時,就會出現(xiàn)“索引 20 不是為負(fù)數(shù),就是大于行數(shù)”的類似的錯誤2013-04-04
TreeView無刷新獲取text及value實現(xiàn)代碼
這篇文章介紹了TreeView無刷新獲取text及value實現(xiàn)代碼,有需要的朋友可以參考一下2013-10-10

