日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

對Entity?Framework?Core進行單元測試_實用技巧

作者:.NET開發菜鳥 ? 更新時間: 2022-05-27 編程語言

一、引言

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

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

原文鏈接:https://www.cnblogs.com/dotnet261010/p/12350558.html

欄目分類
最近更新