首頁 > 軟體

對Entity Framework Core進行單元測試

2022-03-24 16:00:40

一、引言

我們先來講解如何對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的那條資料,所以測試報錯了。

到此為止,我們就完成了一個簡單的單元測試。

到此這篇關於對Entity Framework Core進行單元測試的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com