Source profileQuality 91/100

dotnet/skills/plugins/dotnet-experimental/skills/exp-mock-usage-analysis/SKILL.md

exp-mock-usage-analysis

Audits .NET test mock usage by tracing each mock setup through the production code's execution path to find dead, unreachable, redundant, or replaceable mocks. Use when the user asks to audit mock usage, find unused or unnecessary mock setups, check if mocks are needed, reduce mock duplication or over-mocking, simplify test setup, or review whether mock configurations like ILogger/IOptions should use real implementations instead. Supports Moq, NSubstitute, and FakeItEasy.

Source repository stars
5,248
Declared platforms
0
Static risk flags
0
Last source update
2026-08-26
Source checked
2026-08-26

Decision brief

What it does: where it fits

Trace each mock setup through the production code's execution path to determine which setups are actually exercised at runtime and which are dead, unreachable, redundant, or replaceable with real implementations.

Best for

  • User asks to audit, review, or analyze mock usage in .NET tests
  • User wants to find unused, unnecessary, or redundant mock setups
  • User wants to simplify test setup or reduce over-mocking

Not for

  • User wants to write new mocks or tests (general testing guidance)
  • User wants to detect non-mock test anti-patterns (use test-anti-patterns)

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/dotnet/skills --skill "plugins/dotnet-experimental/skills/exp-mock-usage-analysis"
Safe inspection promptEditorial

Inspect the Agent Skill "exp-mock-usage-analysis" from https://github.com/dotnet/skills/blob/1b896e91feb0f613cb54a914f1efd2897810ae02/plugins/dotnet-experimental/skills/exp-mock-usage-analysis/SKILL.md at commit 1b896e91feb0f613cb54a914f1efd2897810ae02. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Workflow

    Read the test files and always read the production code. You cannot determine whether a mock setup is necessary without understanding the production method's control flow.

    Moq: new Mock(), .Setup(...), .Verify(...)NSubstitute: Substitute.For(), .Returns(...), .Received(...)FakeItEasy: A.Fake(), A.CallTo(...), .MustHaveHappened()
  2. 02

    Step 1: Read all provided code

    Read the test files and always read the production code. You cannot determine whether a mock setup is necessary without understanding the production method's control flow.

    Moq: new Mock(), .Setup(...), .Verify(...)NSubstitute: Substitute.For(), .Returns(...), .Received(...)FakeItEasy: A.Fake(), A.CallTo(...), .MustHaveHappened()
  3. 03

    Step 2: Trace each mock setup through the production code

    For each test method, do the following:

    Identify every mock setup line (.Setup, .Returns, A.CallTo, etc.)Read the production method being tested and trace its execution path for the specific inputs used in that testDetermine which mock setups are actually reached during execution
  4. 04

    Step 3: Check for replaceable mocks

    Flag mocks of stable framework types that should use real implementations: - Mock → NullLogger.Instance (unless log output is asserted) - Mock → Options.Create(new T { ... }) - Mocks of DTOs, records, or value objects → use new T { ... } directly

    Mock → NullLogger.Instance (unless log output is asserted)Mock → Options.Create(new T { ... })Mocks of DTOs, records, or value objects → use new T { ... } directly
  5. 05

    Step 4: Report findings

    For each finding, state: 1. The specific test method and mock setup line 2. Why the setup is unnecessary (trace the production code path to explain) 3. A concrete fix — which lines to remove, what to replace them with, or how to extract shared setup

    The specific test method and mock setup lineWhy the setup is unnecessary (trace the production code path to explain)A concrete fix — which lines to remove, what to replace them with, or how to extract shared setup

Permission review

Static risk signals and limitations

No configured static risk pattern was detected

This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score91/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars5,248SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
dotnet/skills
Skill path
plugins/dotnet-experimental/skills/exp-mock-usage-analysis/SKILL.md
Commit
1b896e91feb0f613cb54a914f1efd2897810ae02
License
MIT
Collected
2026-08-26
Default branch
main
View the original SKILL.md

Mock Usage Analysis

Trace each mock setup through the production code's execution path to determine which setups are actually exercised at runtime and which are dead, unreachable, redundant, or replaceable with real implementations.

When to Use

  • User asks to audit, review, or analyze mock usage in .NET tests
  • User wants to find unused, unnecessary, or redundant mock setups
  • User wants to simplify test setup or reduce over-mocking
  • User asks whether mocks of ILogger, IOptions, or similar types are needed

When Not to Use

  • User wants to write new mocks or tests (general testing guidance)
  • User wants to detect non-mock test anti-patterns (use test-anti-patterns)
  • User wants to migrate between mock frameworks (out of scope)

Inputs

InputRequiredDescription
Test codeYesTest files to analyze
Production codeYesCode under test — essential for tracing execution paths

Workflow

Step 1: Read all provided code

Read the test files and always read the production code. You cannot determine whether a mock setup is necessary without understanding the production method's control flow.

Identify the mock framework by scanning for its patterns:

  • Moq: new Mock<T>(), .Setup(...), .Verify(...)
  • NSubstitute: Substitute.For<T>(), .Returns(...), .Received(...)
  • FakeItEasy: A.Fake<T>(), A.CallTo(...), .MustHaveHappened()

Use the correct framework's terminology throughout your analysis.

Step 2: Trace each mock setup through the production code

For each test method, do the following:

  1. Identify every mock setup line (.Setup, .Returns, A.CallTo, etc.)
  2. Read the production method being tested and trace its execution path for the specific inputs used in that test
  3. Determine which mock setups are actually reached during execution
  4. Classify each setup:
ClassificationMeaningExample
UsedThe production code calls this mock during the test's execution pathGetStock setup when Reserve is called and stock is sufficient
UnreachableThe production code returns early, throws, or branches away before reaching this mock callUpdateStock setup when the test expects the method to throw ArgumentOutOfRangeException on the first line
UnusedThe mock method is never called by the production method under test at all, regardless of inputsGetLowStockProducts setup when testing Reserve, which never calls that method
RedundantIdentical mock configurations are duplicated across multiple tests instead of being sharedFive tests each creating new Mock<IPaymentGateway>() with the same default setup

Pay special attention to:

  • Early returns and guard clauses — setups for mocks called after a guard clause are unreachable when the guard triggers
  • Exception throws — if the method throws before using dependencies, all setups for those dependencies are unnecessary
  • Branch-specific logic — if a method dispatches by channel/type, setups for other channels are unused
  • Verify-only tests — tests that only call .Verify/.Received/.MustHaveHappened without asserting on the method's return value

Step 3: Check for replaceable mocks

Flag mocks of stable framework types that should use real implementations:

  • Mock<ILogger<T>>NullLogger<T>.Instance (unless log output is asserted)
  • Mock<IOptions<T>>Options.Create(new T { ... })
  • Mocks of DTOs, records, or value objects → use new T { ... } directly

Explicitly confirm which mocks are correctly placed — external boundaries (databases, HTTP clients, message queues, third-party APIs) and security-sensitive types should remain mocked.

Step 4: Report findings

For each finding, state:

  1. The specific test method and mock setup line
  2. Why the setup is unnecessary (trace the production code path to explain)
  3. A concrete fix — which lines to remove, what to replace them with, or how to extract shared setup

When multiple tests duplicate mock configurations, provide a before/after example showing how to extract shared setup into a fixture or helper method.

Validation

  • Production code was read and execution paths were traced (not just test code reviewed)
  • Every finding references a specific test method and setup line
  • Unreachable setups include an explanation of which production code path makes them unreachable
  • Correctly-placed mocks (external boundaries) are explicitly noted as appropriate
  • Correct framework terminology is used throughout (not mixing Moq/NSubstitute/FakeItEasy terms)

Common Pitfalls

PitfallSolution
Analyzing test code without reading production codeAlways read the production method to trace which mocks are actually called
Flagging mocks for external boundaries (HTTP, DB)These are valid isolation boundaries — keep them mocked
Flagging ILogger mock when log output is assertedOnly flag when the mock is set up but log output is never verified
Using wrong framework terminologyMatch the framework in the code: Moq (Setup/Verify), NSubstitute (Returns/Received), FakeItEasy (A.CallTo/MustHaveHappened)

Frequently asked questions

What to verify before installation and use

What does the exp-mock-usage-analysis source document cover?

Trace each mock setup through the production code's execution path to determine which setups are actually exercised at runtime and which are dead, unreachable, redundant, or replaceable with real implementations.

How do I install exp-mock-usage-analysis?

The source record exposes this install command: npx skills add https://github.com/dotnet/skills --skill "plugins/dotnet-experimental/skills/exp-mock-usage-analysis". Inspect the command and pinned source before running it.

Alternatives

Compare before choosing

Computed 10024,975

alirezarezvani/claude-skills

app-store-optimization

App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

Computed 976,854

trailofbits/skills

constant-time-testing

Constant-time testing detects timing side channels in cryptographic code. Use when auditing crypto implementations for timing vulnerabilities.

Computed 975,248

dotnet/skills

test-tagging

Analyzes test suites in any language and tags each test with standardized traits (positive, negative, critical-path, boundary, smoke, regression, integration, performance, security). Use when the user wants to categorize, audit, or label tests with traits. Works across .NET (MSTest/xUnit/NUnit/TUnit), Python (pytest), TS/JS (Jest/Vitest), Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, and C++ — auto-editing when the framework has canonical tag syntax, otherwise report-only. Do not use for writ

Computed 97224

yonatangross/orchestkit

verify

Grade work that already exists and decide whether it can merge. Runs the project's current unit, integration, and E2E suites plus security scanning and type checking, scores every dimension 0-10, and returns a merge verdict with a VERIFIED-vs-CLAIMED evidence manifest. Writes no test files and edits no source. Use when verifying changes are ready to merge. Use /ork:cover instead when the tests still have to be written.