.NET单元测试使用AutoFixture按需填充的几种方式和最佳实践记录
AutoFixture
是一个.NET库,旨在简化单元测试中的数据设置过程。通过自动生成测试数据,它帮助开发者减少测试代码的编写量,使得单元测试更加简洁、易读和易维护。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
生成的User对象,他会默认给你填充Id为随机整数,Name和Email为一串Guid,显然这里的邮箱地址生成就不能满足要求,并不是一个有效的邮箱格式
那么如何让AutoFixture按需生成有效的测试数据呢?方法其实有好几种:
方法1:直接定制
var fixture = new Fixture(); fixture.Customize(c => c .With(x => x.Email, "特定值") .Without(x => x.Id));
这里,With方法用于指定属性的具体值,而Without方法用于排除某些属性不被自动填充。
方法2:使用匿名函数
这在需要对生成的数据进行更复杂的操作时非常有用。
var fixture = new Fixture(); fixture.Customize(c => c.FromFactory(() => new User { Email = "通过工厂方法生成", }));
方法3:实现ICustomization接口
对于更复杂的定制需求,可以通过实现ICustomization接口来创建一个定制化类。这种方法的好处是可以重用定制逻辑,并且使得测试代码更加整洁。
public class MyCustomClassCustomization : ICustomization { public void Customize(IFixture fixture) { fixture.Customize(c => c .With(x => x.Email, "自定义值") .Without(x => x.Id)); } } // 使用定制化 var fixture = new Fixture(); fixture.Customize(new MyCustomClassCustomization());
方法4:使用Build
方法
Build
方法提供了一种链式调用的方式来定制类型的生成规则,这在只需要对单个对象进行简单定制时非常方便。
var myCustomObject = fixture.Build() .With(x => x.Email, $"{Guid.NewId()}@example.com") .Without(x => x.Id) .Create();
最佳实践:
这里以xunit
测试框架为例,
我们需要提前引用AutoFixture
,AutoFixture.Xunit2
库,实现一个UserAutoDataAttribute
类,继承自InlineAutoDataAttribute
重写GetData
方法,大致代码如下:
public class UserAutoDataAttribute : InlineAutoDataAttribute { public UserAutoDataAttribute(params object[] values) : base(values) { ArgumentNullException.ThrowIfNull(values[0]); } public override IEnumerable
下面是一个测试用例,需要填充db,和一个自动生成的User参数
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(options => { options.UseInMemoryDatabase($"test-{db}"); }); services.AddUnitOfWork (); var provider = services.BuildServiceProvider(); var uow = provider.GetRequiredService >(); //add user await uow.GetRepository ().InsertAsync(user); await uow.SaveChangesAsync(); // select user var user2 = await uow.GetRepository ().FindAsync(1); Assert.NotNull(user2); // delete user uow.GetRepository ().Delete(1); var row = await uow.SaveChangesAsync(); Assert.Equal(1, row); // select user user2 = await uow.GetRepository ().GetFirstOrDefaultAsync(x => x.Id == 1); Assert.Null(user2); } }
如果你已经习惯编写单元测试,但还没有使用AutoFixture
,那么推荐你尝试一下,也许你也会喜欢上TA
到此这篇关于.NET单元测试使用AutoFixture按需填充的几种方式和最佳实践记录的文章就介绍到这了,更多相关.NET单元测试使用AutoFixture按需填充内容请搜索科站长以前的文章或继续浏览下面的相关文章希望大家以后多多支持科站长!
栏 目:ASP.NET
下一篇:在.NET Web API设置响应输出Json数据格式常用的两种方式详解
本文标题:.NET单元测试使用AutoFixture按需填充的几种方式和最佳实践记录
本文地址:https://www.fushidao.cc/wangluobiancheng/3254.html
您可能感兴趣的文章
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 02-06.net core如何使用Nacos注册中心
- 01-28使用.NET8构建一个高效的时间日期帮助类
- 01-26.NET Core GC压缩(compact_phase)底层原理解析
- 01-24在ASP.NET中读写TXT文本文件的多种方法
- 01-24在ASP.NET中读写XML数据的多种方法
- 01-24.NET轻松实现Excel转PDF的三种方法详解
- 01-23.NET9 AOT部署方案详解
- 01-23.NET NativeAOT 用法指南
- 01-23iis部署前后端分离项目全过程(Vuet前端和.NET6后端)


阅读排行
推荐教程
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 11-23移动互联网广告有哪些模式?
- 11-22.net 应对网站访问压力的方案总结
- 11-22详解ASP.NET提取多层嵌套json数据的方法
- 11-23网站投放广告如何达到最好的效果
- 11-22.net 应对网站访问压力的方案总结
- 11-23网站打开速度慢解决办法
- 11-23草根站长为什么喜欢做门户站
- 11-22ASP.NET MVC分页问题解决
- 11-22ASP.NET编程简单实现生成静态页面的方法