moq
Sorcha-Platform/Sorcha/.claude/skills/moq/SKILL.md
Mocks dependencies in unit tests using Moq framework. Use when: writing unit tests, creating test doubles for interfaces, verifying method calls, mocking async operations
Skill2 starsChanged 8 months ago
What's in it
- Moq Skill
- Quick Start
- Basic Mock Setup
- Async Method Mock
- Verification
- Key Concepts
- Common Patterns
- Logger Mock (Quick)
- Options Pattern Mock
- 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: moq
description: |
Mocks dependencies in unit tests using Moq framework.
Use when: writing unit tests, creating test doubles for interfaces, verifying method calls, mocking async operations
allowed-tools: Read, Edit, Write, Glob, Grep, Bash, mcp__context7__resolve-library-id, mcp__context7__query-docs
---
# Moq Skill
Moq provides type-safe mocking for .NET unit tests. Sorcha uses Moq extensively across 30+ test projects to isolate components and verify interactions. The codebase favors constructor injection with mocks stored as `private readonly` fields.
## Quick Start
### Basic Mock Setup
```csharp
public class WalletManagerTests
{
private readonly Mock<ICryptoModule> _mockCryptoModule;
private readonly Mock<IHashProvider> _mockHashProvider;
public WalletManagerTests()
{
_mockCryptoModule = new Mock<ICryptoModule>();
_mockHashProvider = new Mock<IHashProvider>();
}
}
```
### Async Method Mock
```csharp
_mockCryptoModule
.Setup(x => x.GenerateKeySetAsync(
It.IsAny<WalletNetworks>(),
It.IsAny<byte[]>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(CryptoResult<KeySet>.Success(keySet));
```
### Verification
```csharp
_mockRegisterManager.Verify(
m => m.CreateRegisterAsync("Test Register", "tenant-123", false, true, It.IsAny<CancellationToken>()),
Times.Once);
```
## Key Concepts
| Concept | Usage | Example |
|---------|-------|---------|
| `Mock<T>` | Create mock instance | `new Mock<IService>()` |
| `.Object` | Get mock instance | `_mock.Object` |
| `Mock.Of<T>()` | Quick mock for simple deps | `Mock.Of<ILogger<T>>()` |
| `Setup()` | Configure behavior | `.Setup(x => x.Method())` |
| `ReturnsAsync()` | Async return value | `.ReturnsAsync(result)` |
| `Callback()` | Capture arguments | `.Callback<T>((arg) => captured = arg)` |
| `Verify()` | Assert method called | `.Verify(x => x.Method(), Times.Once)` |
| `It.IsAny<T>()` | Match any argument | `It.IsAny<string>()` |
| `It.Is<T>()` | Match with predicate | `It.Is<T>(x => x.Id == 1)` |
## Common Patterns
### Logger Mock (Quick)
**When:** You need a logger but don't care about verifying logs.
```csharp
var service = new WalletManager(Mock.Of<ILogger<WalletManager>>());
```
### Options Pattern Mock
**When:** Injecting `IOptions<T>` dependencies.
```csharp
var mockConfig = new Mock<IOptions<PeerServiceConfiguration>>();
mockConfig.Setup(x => x.Value).Returns(new PeerServiceConfiguration { Enabled = true });
```
## See Also
- [patterns](references/patterns.md) - Detailed setup and verification patterns
- [workflows](references/workflows.md) - Test writing workflows and integration testing
## Related Skills
- See the **xunit** skill for test framework patterns
- See the **fluent-assertions** skill for assertion syntax
- See the **entity-framework** skill for mocking DbContext
## Documentation Resources
> Fetch latest Moq documentation with Context7.
**How to use Context7:**
1. Use `mcp__context7__resolve-library-id` to search for "moq"
2. Query with `mcp__context7__query-docs` using the resolved library ID
**Library ID:** `/devlooped/moq`
**Recommended Queries:**
- "moq setup verify async methods"
- "moq callbacks parameter capture"
- "moq argument matching It.Is"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
- fluent-assertions.claude/skills/fluent-assertions/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
- 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.
Reports can't be read right now.
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.

