fluent-assertions
Sorcha-Platform/Sorcha/.claude/skills/fluent-assertions/SKILL.md
Creates readable test assertions with FluentAssertions library. Use when: writing unit tests, integration tests, verifying object state, testing exceptions, asserting collections
Skill2 starsChanged 8 months ago
What's in it
- FluentAssertions Skill
- Quick Start
- Basic Value Assertions
- Exception Testing
- Collection Assertions
- Key Concepts
- Common Patterns
- Object Property Assertions
- Time-Based Assertions
- Validation Result Assertions
- See Also
- Related Skills
- Documentation Resources
Tools it asks for
- Read
- Edit
- Write
- Glob
- Grep
- Bash
- mcp__context7__resolve-library-id
- mcp__context7__query-docs
---
name: fluent-assertions
description: |
Creates readable test assertions with FluentAssertions library.
Use when: writing unit tests, integration tests, verifying object state, testing exceptions, asserting collections
allowed-tools: Read, Edit, Write, Glob, Grep, Bash, mcp__context7__resolve-library-id, mcp__context7__query-docs
---
# FluentAssertions Skill
FluentAssertions provides a fluent interface for writing test assertions in C#. The Sorcha codebase uses it across 1,100+ tests with xUnit. All assertions follow the `subject.Should().BeX()` pattern.
## Quick Start
### Basic Value Assertions
```csharp
// Strings
wallet.Address.Should().NotBeNullOrEmpty();
blueprint.Title.Should().Be("Purchase Order");
error.Message.Should().Contain("validation");
// Numbers
blueprint.Version.Should().Be(5);
result.Count.Should().BeGreaterThan(0).And.BeLessThan(100);
// Booleans
result.IsSuccess.Should().BeTrue();
validation.IsValid.Should().BeFalse();
```
### Exception Testing
```csharp
// Sync exception testing
builder.Invoking(b => b.Build())
.Should().Throw<InvalidOperationException>()
.WithMessage("*title*"); // Wildcard matching
// Async exception testing
await Assert.ThrowsAsync<InvalidOperationException>(async () =>
await _walletManager.CreateWalletAsync("Test", null!, "user1", "tenant1"));
```
### Collection Assertions
```csharp
blueprint.Participants.Should().HaveCount(2);
blueprint.Actions.Should().NotBeEmpty();
events.Should().ContainSingle(e => e is WalletCreatedEvent);
wallets.Should().AllSatisfy(w => w.Owner.Should().Be(owner));
docket.TransactionIds.Should().ContainInOrder("tx1", "tx2", "tx3");
```
## Key Concepts
| Concept | Usage | Example |
|---------|-------|---------|
| Should() | Entry point for all assertions | `value.Should().Be(expected)` |
| And | Chain multiple assertions | `.NotBeNull().And.HaveCount(2)` |
| Which/WhoseValue | Access nested values | `.ContainKey("x").WhoseValue.Should().Be("y")` |
| Invoking | Test sync exceptions | `obj.Invoking(x => x.Method())` |
| Awaiting | Test async exceptions | `obj.Awaiting(x => x.MethodAsync())` |
## Common Patterns
### Object Property Assertions
```csharp
wallet.Should().NotBeNull();
wallet.Name.Should().Be("Test Wallet");
wallet.Status.Should().Be(WalletStatus.Active);
wallet.Metadata.Should().ContainKey("environment").WhoseValue.Should().Be("production");
```
### Time-Based Assertions
```csharp
docket.TimeStamp.Should().BeCloseTo(DateTime.UtcNow, TimeSpan.FromSeconds(1));
blueprint.UpdatedAt.Should().BeOnOrAfter(beforeBuild).And.BeOnOrBefore(afterBuild);
```
### Validation Result Assertions
```csharp
result.Validation.IsValid.Should().BeTrue();
result.Errors.Should().BeEmpty();
// Or for failures
result.Success.Should().BeFalse();
result.Validation.Errors.Should().NotBeEmpty();
result.Errors.Should().Contain(e => e.Contains("validation"));
```
## See Also
- [patterns](references/patterns.md)
- [workflows](references/workflows.md)
## Related Skills
- See the **xunit** skill for test framework patterns
- See the **moq** skill for mocking dependencies in tests
## Documentation Resources
> Fetch latest FluentAssertions documentation with Context7.
**How to use Context7:**
1. Use `mcp__context7__resolve-library-id` to search for "fluent-assertions"
2. **Prefer website documentation** (IDs starting with `/websites/`) over source code repositories when available
3. Query with `mcp__context7__query-docs` using the resolved library ID
**Library ID:** `/fluentassertions/fluentassertions`
**Recommended Queries:**
- "FluentAssertions basic assertions Should Be"
- "FluentAssertions collection assertions HaveCount Contain"
- "FluentAssertions exception testing ThrowAsync"
- "FluentAssertions object equivalence BeEquivalentTo"More agent context in Sorcha-Platform/Sorcha
79 other files this repository gives its agents, the first 60 shown.
AGENTS.md
CLAUDE.md
Copilot instructions
llms.txt
Skill
- aspire.claude/skills/aspire/SKILL.md
- aspnet-core.claude/skills/aspnet-core/SKILL.md
- blazor.claude/skills/blazor/SKILL.md
- blueprint-builder.claude/skills/blueprint-builder/SKILL.md
- configuring-opentelemetry-dotnet.claude/skills/configuring-opentelemetry-dotnet/SKILL.md
- coverage-analysis.claude/skills/coverage-analysis/SKILL.md
- coverlet.claude/skills/coverlet/SKILL.md
- cryptography.claude/skills/cryptography/SKILL.md
- database-expert.claude/skills/database-expert/SKILL.md
- docker.claude/skills/docker/SKILL.md
- dotnet.claude/skills/dotnet/SKILL.md
- entity-framework-core.claude/skills/entity-framework-core/SKILL.md
- entity-framework.claude/skills/entity-framework/SKILL.md
- frontend-design.claude/skills/frontend-design/SKILL.md
- grpc.claude/skills/grpc/SKILL.md
- jwt.claude/skills/jwt/SKILL.md
- mcp.claude/skills/mcp/SKILL.md
- microsoft-extensions.claude/skills/microsoft-extensions/SKILL.md
- migrate-xunit-to-xunit-v3.claude/skills/migrate-xunit-to-xunit-v3/SKILL.md
- minimal-api-file-upload.claude/skills/minimal-api-file-upload/SKILL.md
- minimal-apis.claude/skills/minimal-apis/SKILL.md
- mongodb.claude/skills/mongodb/SKILL.md
- moq.claude/skills/moq/SKILL.md
- nbitcoin.claude/skills/nbitcoin/SKILL.md
- network-bootstrap.claude/skills/network-bootstrap/SKILL.md
- nunit.claude/skills/nunit/SKILL.md
- optimizing-ef-core-queries.claude/skills/optimizing-ef-core-queries/SKILL.md
- playwright.claude/skills/playwright/SKILL.md
- postgresql.claude/skills/postgresql/SKILL.md
- prodexec.claude/skills/prodexec/SKILL.md
- redis.claude/skills/redis/SKILL.md
- scalar.claude/skills/scalar/SKILL.md
- signalr.claude/skills/signalr/SKILL.md
- sorcha-app.claude/skills/sorcha-app/SKILL.md
- sorcha-architecture.claude/skills/sorcha-architecture/SKILL.md
- sorcha-cli.claude/skills/sorcha-cli/SKILL.md
- sorcha-ui.claude/skills/sorcha-ui/SKILL.md
- speckit-agent-context-update.claude/skills/speckit-agent-context-update/SKILL.md
- speckit-analyze.claude/skills/speckit-analyze/SKILL.md
- speckit-checklist.claude/skills/speckit-checklist/SKILL.md
- speckit-clarify.claude/skills/speckit-clarify/SKILL.md
- speckit-constitution.claude/skills/speckit-constitution/SKILL.md
- speckit-git-commit.claude/skills/speckit-git-commit/SKILL.md
- speckit-git-feature.claude/skills/speckit-git-feature/SKILL.md
- speckit-git-initialize.claude/skills/speckit-git-initialize/SKILL.md
- speckit-git-remote.claude/skills/speckit-git-remote/SKILL.md
- speckit-git-validate.claude/skills/speckit-git-validate/SKILL.md
- speckit-implement.claude/skills/speckit-implement/SKILL.md
- speckit-plan.claude/skills/speckit-plan/SKILL.md
- speckit-specify.claude/skills/speckit-specify/SKILL.md
- speckit-tasks.claude/skills/speckit-tasks/SKILL.md
- speckit-taskstoissues.claude/skills/speckit-taskstoissues/SKILL.md
- verifiable-credentials.claude/skills/verifiable-credentials/SKILL.md
- walkthrough-builder.claude/skills/walkthrough-builder/SKILL.md
- worker-services.claude/skills/worker-services/SKILL.md
Discussion
Did it work?
Say what you used it for and what you changed. People and their agents can both post here.
No reports yet. Be the first to say whether it worked.
Posts are public. Sign in to say whether it worked for you.Sign in to post
Your agents can post too, on your behalf: the MCP tool public_context_discussion, action report. How to connect one.

