公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

.NET單元測試使用AutoFixture按需填充的幾種方式和最佳實踐

freeflydom
2024年7月22日 10:29 本文熱度 1466

AutoFixture是一個.NET庫,旨在簡化單元測試中的數(shù)據(jù)設(shè)置過程。通過自動生成測試數(shù)據(jù),它幫助開發(fā)者減少測試代碼的編寫量,使得單元測試更加簡潔、易讀和易維護。AutoFixture可以用于任何.NET測試框架,如xUnit、NUnit或MSTest。

默認情況下AutoFixture生成的字段值很多時候都滿足不了測試需求,比如:

public class User

{

public int Id { get; set; }

public string Name { get; set; } = null!;

[EmailAddress]

public string? Email { get; set; }

[StringLength(512)]

public string? Address { get; set; }

public DateTime CreatedAt { get; set; } = DateTime.Now;

}

如果直接使用 Create<T>()生成的User對象,他會默認給你填充Id為隨機整數(shù),Name和Email為一串Guid,顯然這里的郵箱地址生成就不能滿足要求,并不是一個有效的郵箱格式

那么如何讓AutoFixture按需生成有效的測試數(shù)據(jù)呢?方法其實有好幾種:

方法1:直接定制

var fixture = new Fixture();

fixture.Customize<User>(c => c

    .With(x => x.Email, "特定值")

    .Without(x => x.Id));

這里,With方法用于指定屬性的具體值,而Without方法用于排除某些屬性不被自動填充。

方法2:使用匿名函數(shù)

這在需要對生成的數(shù)據(jù)進行更復(fù)雜的操作時非常有用。

var fixture = new Fixture();

fixture.Customize<User>(c => c.FromFactory(() => new User

{

    Email = "通過工廠方法生成",

}));

方法3:實現(xiàn)ICustomization接口

對于更復(fù)雜的定制需求,可以通過實現(xiàn)ICustomization接口來創(chuàng)建一個定制化類。這種方法的好處是可以重用定制邏輯,并且使得測試代碼更加整潔。

public class MyCustomClassCustomization : ICustomization

{

    public void Customize(IFixture fixture)

    {

        fixture.Customize<User>(c => c

            .With(x => x.Email, "自定義值")

            .Without(x => x.Id));

    }

}

// 使用定制化

var fixture = new Fixture();

fixture.Customize(new MyCustomClassCustomization());

方法4:使用Build<T>方法

Build<T>方法提供了一種鏈式調(diào)用的方式來定制類型的生成規(guī)則,這在只需要對單個對象進行簡單定制時非常方便。

var myCustomObject = fixture.Build<User>()

                            .With(x => x.Email, $"{Guid.NewId()}@example.com")

                            .Without(x => x.Id)

                            .Create();

最佳實踐:

這里以xunit測試框架為例,
我們需要提前引用AutoFixture,AutoFixture.Xunit2庫,實現(xiàn)一個UserAutoDataAttribute類,繼承自InlineAutoDataAttribute 重寫GetData方法,大致代碼如下:

public  class UserAutoDataAttribute : InlineAutoDataAttribute

    {

        public UserAutoDataAttribute(params object[] values) : base(values)

        {

            ArgumentNullException.ThrowIfNull(values[0]);

        }


        public override IEnumerable<object[]> GetData(MethodInfo testMethod)

        {

            var fixture = new Fixture();

            //這里使用上面的4種方式的一種,亦或者根據(jù)自身情況定制!

            var user = fixture.Build<User>()

                 //.With(x => x.Id, 0)

                 .Without(x => x.Id) //ID需要排除因為EFCore需要插入時自動生成

                 .With(x => x.Email, $"{Uuid7.NewUuid7()}@example.com") //郵箱地址,需要照規(guī)則生成

                 .Create();

            yield return new object[] { Values[0], user };

        }

    }

下面是一個測試用例,需要填充db,和一個自動生成的User參數(shù)

public class UnitOfWorkTests(ITestOutputHelper output)

{

[Theory]

[UserAutoData(1)]

[UserAutoData(2)]

public async Task MyUnitOfWorkTest(int db, User user)

{

var services = new ServiceCollection();

services.AddLogging();

services.AddDbContext<TestDbContext>(options =>

{

                    options.UseInMemoryDatabase($"test-{db}");

});

services.AddUnitOfWork<TestDbContext>();


var provider = services.BuildServiceProvider();

var uow = provider.GetRequiredService<IUnitOfWork<TestDbContext>>();


//add user

await uow.GetRepository<User>().InsertAsync(user);

await uow.SaveChangesAsync();


// select user

var user2 = await uow.GetRepository<User>().FindAsync(1);

Assert.NotNull(user2);


// delete user

uow.GetRepository<User>().Delete(1);

var row = await uow.SaveChangesAsync();


Assert.Equal(1, row);


// select user

user2 = await uow.GetRepository<User>().GetFirstOrDefaultAsync(x => x.Id == 1);

Assert.Null(user2);

}

}

如果你已經(jīng)習(xí)慣編寫單元測試,但還沒有使用AutoFixture,那么推薦你嘗試一下,也許你也會喜歡上TA

轉(zhuǎn)自https://www.cnblogs.com/vipwan/p/18311419 作者萬雅虎


該文章在 2024/7/22 10:29:20 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产成人精品97 | 高潮毛片无遮挡免费高清69 | 91无码人妻aⅴ一区二区三区 | 国产在线精品一区在线观看 | 97精品亚成在人线免视频 | 国产精品无码不卡一 | 91亚洲中文天堂在线播放 | 国产性感美女污污无 | 韩国软件视频gay | 国产成人无码a区在线观看视频 | 高清不卡免费一区二区三区 | 国产欧美日韩综合视频专区 | 国产精品人人妻人人狠 | 国产成人无码aⅴ片在线观看不卡 | 精品久久无码专区国产精品发布 | 国产在线播放剧情演绎 | 国产成人片视频一区二区 | 91精品丝袜国产在线一区 | 丰满人妻精品一区二区 | 精品一区二区av天堂 | 国产偷抇久久精品水蜜桃 | 国产日韩欧美一区二区三区四区 | 果冻传媒av在线观看入口 | 成人在线播放网站 | 国产亚洲制服国产亚洲制服 | 精品香蕉久久久午夜福利 | 91久久中文精品无码中文字幕 | 精品麻豆三级 | 99久久久国产精品免费不卡 | 国产一区二区三区免费在线观看 | 国产高清精品亚洲一区二区三 | 2025麻豆福利午夜久久 | 潮喷好爽在线观看视频 | av在线无毒免费观看 | 国产女王女调教另类调教在线 | 国产成人无码a区播放视频 国产成人无码a区视频在线观看 | 国产激情久久久久影院蜜桃aⅴ | 91精品国产免费网站 | 国产成人秘在线观看免费网站 | 国产精品乱子伦一区二区三区 | 韩国少妇激三级做爰在线观看 |