尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
eShopOnWeb单元测试教程:Builder模式+FluentAssertions打造高可维护测试
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),仅供参考
RELATED

相关推荐

移动端发热元凶?光照烘焙让GPU功耗直降,画面不缩水

移动端发热元凶?光照烘焙让GPU功耗直降,画面不缩水

最近在群里聊起手机发烫这个话题,我发现很多朋友第一反应是锁帧率、降画质、换散热背夹,这些办法不能说没用,但都是在“事后补救”。真正高效的思路其实是在渲染源头把开销降下来,而光照烘焙就是这个系列里我最想推荐的一招。它省…

📅 2026/9/19 15:58:35
可修复系统可靠性评估:状态空间法、频率平衡法与框图法详解

可修复系统可靠性评估:状态空间法、频率平衡法与框图法详解

简介:这份电力系统规划与可靠性主题课件,面向电力专业学生、电网规划与可靠性工程师,重点讲解可修复系统可靠性的核心概念与计算方法。内容涵盖预防性维修与矫正性维修的区别,以及可靠度、可用度、不可用度等关键指标,…

📅 2026/9/19 15:53:35
Cursor 跑第一个可验证 Demo,Base URL 填 TaoToken

Cursor 跑第一个可验证 Demo,Base URL 填 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/19 15:53:35
MORE NEWS

更多资讯

📰

一文读懂CMake:跨平台构建系统生成器核心概念与实战指南

弄懂CMake是什么,看完这篇就够了!第一次正经接触CMake,是在一个需要跨平台编译的C项目里。项目从Windows迁到Linux,Makefile那套东西变得极其难维护,同事丢过来一个CMakeLists.txt说“用这个”,我盯着那堆大…

📰

CANN Runtime Event 管理 API 模块化拆分指南:22 个 ACL 接口的批次规划、归属判定与三阶段迁移实践

CANN Runtime Event 管理 API 模块化拆分指南:22 个 ACL 接口的批次规划、归属判定与三阶段迁移实践 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime CANN Runtime 的 Event 管理模块面向用…

📰

GitHub Copilot替代工具实测:VS Code与Edge场景下的免费方案盘点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ESP32-P4 USB Host鼠标开发全栈排错指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

BrewUI:给Homebrew加可视化界面,让包管理和依赖清理更安全

1. BrewUI是什么,以及它瞄准的三个真实痛点先交代一下背景。我在macOS上用了三年多的Homebrew,日常维护的软件包早就超过了200个,每次想理清楚某个工具是被谁依赖的、哪些包该升级、哪些包该清理,都要在终端里敲一串brew deps --t…

📰

Grafana Tempo 中的 OTLP 指标名转换:深入解析 otlptranslator 的 Prometheus 命名规范化

后端可观测性链路追踪 【免费下载链接】tempo Grafana Tempo is a high volume, minimal dependency distributed tracing backend. 项目地址: https://gitcode.com/GitHub_Trending/tempo1/tempo 点击查看 免费下载 导读 本篇文章围绕 Tempo 仓库中随 vendored 引…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬