d48cda4081
CI / Test (ubuntu-latest, Node 18.x, bun) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, npm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, pnpm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, yarn) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 20.x, bun) (push) Failing after 17m13s
CI / Test (ubuntu-latest, Node 20.x, npm) (push) Failing after 18m42s
CI / Test (ubuntu-latest, Node 20.x, pnpm) (push) Failing after 15m0s
CI / Test (ubuntu-latest, Node 20.x, yarn) (push) Failing after 49m44s
CI / Test (ubuntu-latest, Node 22.x, bun) (push) Failing after 51m55s
CI / Test (ubuntu-latest, Node 22.x, pnpm) (push) Failing after 21m57s
CI / Test (ubuntu-latest, Node 22.x, npm) (push) Failing after 37m39s
CI / Test (ubuntu-latest, Node 22.x, yarn) (push) Failing after 34m7s
CI / Validate Components (push) Failing after 37m15s
CI / Python Tests (push) Failing after 10m1s
CI / Security Scan (push) Failing after 10m1s
CI / Lint (push) Failing after 17m12s
CI / Coverage (push) Failing after 20m19s
CI / Test (macos-latest, Node 18.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, yarn) (push) Has been cancelled
63 lines
1.7 KiB
Markdown
63 lines
1.7 KiB
Markdown
---
|
|
paths:
|
|
- "**/*.fs"
|
|
- "**/*.fsx"
|
|
- "**/*.fsproj"
|
|
---
|
|
# F# Testing
|
|
|
|
> This file extends [common/testing.md](../common/testing.md) with F#-specific content.
|
|
|
|
## Test Framework
|
|
|
|
- Prefer **xUnit** with **FsUnit.xUnit** for F#-friendly assertions
|
|
- Use **Unquote** for quotation-based assertions with clear failure messages
|
|
- Use **FsCheck.xUnit** for property-based testing
|
|
- Use **NSubstitute** or function stubs for mocking dependencies
|
|
- Use **Testcontainers** when integration tests need real infrastructure
|
|
|
|
## Test Organization
|
|
|
|
- Mirror `src/` structure under `tests/`
|
|
- Separate unit, integration, and end-to-end coverage clearly
|
|
- Name tests by behavior, not implementation details
|
|
|
|
```fsharp
|
|
open Xunit
|
|
open Swensen.Unquote
|
|
|
|
[<Fact>]
|
|
let ``PlaceOrder returns success when request is valid`` () =
|
|
let request = { CustomerId = "cust-123"; Items = [ validItem ] }
|
|
let result = OrderService.placeOrder request
|
|
test <@ Result.isOk result @>
|
|
|
|
[<Fact>]
|
|
let ``PlaceOrder returns error when items are empty`` () =
|
|
let request = { CustomerId = "cust-123"; Items = [] }
|
|
let result = OrderService.placeOrder request
|
|
test <@ Result.isError result @>
|
|
```
|
|
|
|
## Property-Based Testing with FsCheck
|
|
|
|
```fsharp
|
|
open FsCheck.Xunit
|
|
|
|
[<Property>]
|
|
let ``order total is never negative`` (items: OrderItem list) =
|
|
let total = Order.calculateTotal items
|
|
total >= 0m
|
|
```
|
|
|
|
## ASP.NET Core Integration Tests
|
|
|
|
- Use `WebApplicationFactory<TEntryPoint>` for API integration coverage
|
|
- Test auth, validation, and serialization through HTTP, not by bypassing middleware
|
|
|
|
## Coverage
|
|
|
|
- Target 80%+ line coverage
|
|
- Focus coverage on domain logic, validation, auth, and failure paths
|
|
- Run `dotnet test` in CI with coverage collection enabled where available
|