资讯动态

eShopOnWeb单元测试教程:Builder模式+FluentAssertions打造高可维护测试

发布时间:2026/9/19 15:58:34 来源:尧图企业网站定制
eShopOnWeb单元测试教程Builder模式FluentAssertions打造高可维护测试【免费下载链接】eShopOnWebSample ASP.NET Core 8.0 reference application, now community supported: https://github.com/NimblePros/eShopOnWeb项目地址: https://gitcode.com/gh_mirrors/es/eShopOnWebeShopOnWeb是微软官方的 ASP.NET Core 8.0 电商参考应用它的tests目录就是一份现成的 .NET 单元测试教材。本教程带你用xUnit NSubstitute Builder 模式 FluentAssertions读懂并写出高可维护的单元测试零基础也能跟着做。一、先看懂测试项目在哪个目录仓库把所有测试集中在 tests/ 下按测试层次分成了 4 个项目测试项目测试对象适合回答的问题UnitTests实体、领域服务、Specification这个纯逻辑对不对IntegrationTests数据库仓储层EF Core 读写数据是否正常FunctionalTestsWeb 页面与 API 行为用户走完流程是否成功PublicApiIntegrationTests公共 API 端点接口契约是否稳定 新手建议从 tests/UnitTests/ 入手它不依赖数据库和网络执行最快、最好读也就是本教程的主角。二、Builder 模式测试数据一句话备好写测试最头疼的是造数据。同一个购物车、订单要在几十个测试里反复构造手写new又长又易错。eShopOnWeb 的解法是把构造逻辑封装成Builder统一放在 tests/UnitTests/Builders/BasketBuilder.cs —— 造购物车OrderBuilder.cs —— 造订单AddressBuilder.cs —— 造收货地址以BasketBuilder为例它内部用NSubstitute快速生成一个可编程的购物车对象L25-L29并提供了WithNoItems()、WithOneBasketItem()等预设状态方法。测试里只需要一行var order new OrderBuilder().WithNoItems(); // 得到一个空订单这就是 Builder 模式的精髓把怎么造数据收口到一处测试里只声明我要什么状态。再看订单总价测试 OrderTotal.csvar order new OrderBuilder().WithNoItems(); Assert.Equal(0, order.Total());三行代码意图一目了然没有任何与总金额无关的噪音。Builder 模式带来的三个好处 ✅可复用地址数据只在 AddressBuilder.cs 里定义一次所有订单测试共享改一处全生效可读性测试名 WithNoItems()这样的方法名合起来就是人话易维护实体构造函数签名变化时只改 Builder不用翻几十个测试文件。 进阶细节BasketBuilder里还演示了Builder 与 Mock 的混搭——真实实体直接new而需要隔离依赖的Basket用Substitute.ForBasket()代替这是 TransferBasket.cs 这类服务层测试的常见套路。三、断言篇xUnit Assert 与 FluentAssertions当前仓库的单元测试使用的是xUnit 自带断言例如 BasketAddItem.csAssert.Equal(_testCatalogItemId, firstItem.CatalogItemId);它能满足需求但嵌套深、链式表达差时可读性会打折扣。这时可以引入FluentAssertions流式断言用自然语言式的链式写法表达同一个断言order.Total().Should().Be(42m, 单价 42 × 数量 1);引入 FluentAssertions 最快配置方法 ⚙️本项目启用了中央包管理见 Directory.Packages.props只需两步在Directory.Packages.props的ItemGroup中声明版本号PackageVersion IncludeFluentAssertions Version6.12.0 /在 UnitTests.csproj 的ItemGroup中引用不写版本号PackageReference IncludeFluentAssertions /⚠️ 版本必须统一放在Directory.Packages.props中否则构建会报错——这是 .NET 8 项目的常见坑。两种断言风格可以共存建议新测试逐步用 FluentAssertions 替换老测试保持现状即可。四、跑起来如何快速执行单元测试在仓库根目录执行需安装 .NET 8 SDKdotnet test tests/UnitTests/UnitTests.csproj若想顺便生成覆盖率报告项目已备好 CodeCoverage.runsettingsdotnet test tests/UnitTests/UnitTests.csproj /p:CollectCoveragetrue /p:CoverletOutputFormatcobertura五、新手速查清单 场景该做什么参考位置测试里反复造同一种数据抽成XxxBuildertests/UnitTests/Builders/依赖外部仓储/接口用 NSubstitute 打桩AddItemToBasket.cs断言表达复杂改用 FluentAssertions 链式写法本教程第三节多组输入输出验证用[Theory] [InlineData]CatalogFilterSpecification.cs验证异常抛出Assert.ThrowsT(() ...)BasketAddItem.cs一句话总结eShopOnWeb 的测试代码告诉我们——好测试 意图清晰的名字 Builder 备好的数据 一句人话的断言。照着 tests/UnitTests/ 的结构搭自己的测试项目可维护性自然就上去了。【免费下载链接】eShopOnWebSample ASP.NET Core 8.0 reference application, now community supported: https://github.com/NimblePros/eShopOnWeb项目地址: https://gitcode.com/gh_mirrors/es/eShopOnWeb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价