最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET單元測試使用AutoFixture按需填充的幾種方式和最佳實(shí)踐記錄

 更新時間:2024年07月21日 09:20:27   作者:萬雅虎  
AutoFixture是一個.NET庫,旨在簡化單元測試中的數(shù)據(jù)設(shè)置過程,通過自動生成測試數(shù)據(jù),它幫助開發(fā)者減少測試代碼的編寫量,使得單元測試更加簡潔、易讀和易維護(hù),本文介紹.NET單元測試使用AutoFixture按需填充的幾種方式和最佳實(shí)踐記錄,感興趣的朋友一起看看吧

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

默認(rèn)情況下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對象,他會默認(rèn)給你填充Id為隨機(jī)整數(shù),Name和Email為一串Guid,顯然這里的郵箱地址生成就不能滿足要求,并不是一個有效的郵箱格式

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

方法1:直接定制

var fixture = new Fixture();
fixture.Customize<User>(c => c
    .With(x => x.Email, "特定值")
    .Without(x => x.Id));

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

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

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

var fixture = new Fixture();
fixture.Customize<User>(c => c.FromFactory(() => new User
{
    Email = "通過工廠方法生成",
}));

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

對于更復(fù)雜的定制需求,可以通過實(shí)現(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>方法提供了一種鏈?zhǔn)秸{(diào)用的方式來定制類型的生成規(guī)則,這在只需要對單個對象進(jìn)行簡單定制時非常方便。

var myCustomObject = fixture.Build<User>()
                            .With(x => x.Email, $"{Guid.NewId()}@example.com")
                            .Without(x => x.Id)
                            .Create();

最佳實(shí)踐:

這里以xunit測試框架為例,
我們需要提前引用AutoFixture,AutoFixture.Xunit2庫,實(shí)現(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需要排除因?yàn)镋FCore需要插入時自動生成
                 .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

到此這篇關(guān)于.NET單元測試使用AutoFixture按需填充的幾種方式和最佳實(shí)踐記錄的文章就介紹到這了,更多相關(guān).NET單元測試使用AutoFixture按需填充內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

拉孜县| 永兴县| 武宁县| 墨竹工卡县| 响水县| 新营市| 通山县| 兴隆县| 温州市| 珠海市| 南涧| 安丘市| 安塞县| 云霄县| 新泰市| 荔浦县| 安顺市| 六枝特区| 浦东新区| 涟源市| 贵溪市| 多伦县| 聂拉木县| 阜新| 武安市| 南澳县| 乐平市| 伊吾县| 灵宝市| 木兰县| 松潘县| 左云县| 石阡县| 多伦县| 房山区| 公安县| 墨竹工卡县| 留坝县| 明光市| 三穗县| 青川县|