跳转至

F# 测试

此文件使用 F# 特定内容扩展 common/testing.md。

测试框架

  • 优先使用 xUnit 和 FsUnit.xUnit 以获得对 F# 友好的断言
  • 使用 Unquote 进行基于引号的断言,并提供清晰的失败消息
  • 使用 FsCheck.xUnit 进行基于属性的测试
  • 使用 NSubstitute 或函数桩来模拟依赖
  • 当集成测试需要真实基础设施时使用 Testcontainers

测试结构

  • 在 tests/ 下镜像 src/ 的结构
  • 明确分离单元测试、集成测试和端到端测试的覆盖范围
  • 以行为而非实现细节为测试命名
open Xunit
open Swensen.Unquote

[<Fact>]
let ``リクエストが有効な場合、PlaceOrder は成功を返す`` () =
    let request = { CustomerId = "cust-123"; Items = [ validItem ] }
    let result = OrderService.placeOrder request
    test <@ Result.isOk result @>

[<Fact>]
let ``アイテムが空の場合、PlaceOrder はエラーを返す`` () =
    let request = { CustomerId = "cust-123"; Items = [] }
    let result = OrderService.placeOrder request
    test <@ Result.isError result @>

使用 FsCheck 进行基于属性的测试

open FsCheck.Xunit

[<Property>]
let ``注文合計が負になることはない`` (items: OrderItem list) =
    let total = Order.calculateTotal items
    total >= 0m

ASP.NET Core 集成测试

  • 使用 WebApplicationFactory<TEntryPoint> 进行 API 集成覆盖
  • 不要绕过中间件,而是通过 HTTP 测试认证、验证和序列化

覆盖率

  • 目标行覆盖率达到 80% 以上
  • 重点关注领域逻辑、验证、认证和失败路径的覆盖
  • 如果可用,在 CI 中启用覆盖率收集并运行 dotnet test

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC