Source profileQuality 91/100Review permissions

dotnet/skills/plugins/dotnet-test/skills/scaffold-dotnet-test-project/SKILL.md

scaffold-dotnet-test-project

Create and wire the first .NET test project. USE FOR: "solution has no tests", Tests.csproj/ProjectReference, solution registration, central packages, or tests missing from CI. DO NOT USE when a suitable project exists, for migration, or for MSTest API/attribute/MSTest.Sdk/parallelization advice without a request to create and wire files (writing-mstest-tests).

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

Decision brief

What it does: where it fits

Create the smallest test project that fits the repository's existing build and test conventions, wire it to the correct production project and build entry point, and prove solution-level test discovery sees it. This skill scaffolds the container for tests; it does not invent a s…

Best for

  • A .NET solution or project has production code but no suitable test project.
  • A user asks to "set up tests" or "add a test project" from a vague starting point.
  • Tests pass when the new .csproj is targeted directly but CI cannot discover it.

Not for

  • A compatible test project already references the target production project.
  • The request is specifically about authoring or modernizing MSTest test code.

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-test/skills/scaffold-dotnet-test-project"
Safe inspection promptEditorial

Inspect the Agent Skill "scaffold-dotnet-test-project" from https://github.com/dotnet/skills/blob/1b896e91feb0f613cb54a914f1efd2897810ae02/plugins/dotnet-test/skills/scaffold-dotnet-test-project/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

    Inspect only the files needed to answer these questions:

    Which production project is in scope?What command does CI or the repository use to build and test?Does a suitable test project already reference that production project?
  2. 02

    Step 1: Establish the repository contract

    Inspect only the files needed to answer these questions:

    Which production project is in scope?What command does CI or the repository use to build and test?Does a suitable test project already reference that production project?
  3. 03

    Step 2: Choose one bounded project

    Default to one test project per production project, named according to repository convention (Foo.Tests, Foo.UnitTests, and so on). For a vague multi-project request, start with the project that owns the user-visible behavior or has the highest-value untested logic; do not creat…

    The user's explicit framework choice.Existing test projects in the same repository.Repository-wide package/SDK conventions.
  4. 04

    Step 3: Scaffold and reference the target

    Use the matching dotnet new template (xunit, nunit, or mstest) rather than hand-writing template boilerplate. Then make only the repository-specific edits:

    Align target framework, nullable, implicit-usings, runner, and package style.Add a ProjectReference to each production project directly exercised byRemove template sample tests that do not test repository behavior.
  5. 05

    Step 4: Register with the real build entry point

    Creating a .csproj is not enough. Add it to the exact solution artifact used by the repository:

    .sln or .slnx: dotnet sln add.slnf: add the project to the underlying solution and include it in theNo solution artifact: keep the existing project-oriented workflow. Do not

Permission review

Static risk signals and limitations

Reads files

low · line 98

The documentation asks the agent to read local files, directories, or repositories.

references. Inspect the resulting project file before continuing.

Runs scripts

medium · line 167

The documentation asks the agent to run terminal commands or scripts.

| Creating a project that CI never sees | Register it with the exact solution/filter used by CI and run that command |

Runs scripts

medium · line 173

The documentation asks the agent to run terminal commands or scripts.

| Treating a green build as test discovery | Run the harness-level test command and observe the test |

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-test/skills/scaffold-dotnet-test-project/SKILL.md
Commit
1b896e91feb0f613cb54a914f1efd2897810ae02
License
MIT
Collected
2026-08-26
Default branch
main
View the original SKILL.md

Scaffold a .NET Test Project

Create the smallest test project that fits the repository's existing build and test conventions, wire it to the correct production project and build entry point, and prove solution-level test discovery sees it. This skill scaffolds the container for tests; it does not invent a solution-wide test architecture.

When to Use

  • A .NET solution or project has production code but no suitable test project.
  • A user asks to "set up tests" or "add a test project" from a vague starting point.
  • Tests pass when the new .csproj is targeted directly but CI cannot discover it.
  • A multi-project solution needs a bounded test project for one production project.

When Not to Use

  • A compatible test project already references the target production project. Reuse it and continue with code-testing-agent.
  • The request is specifically about authoring or modernizing MSTest test code. Use writing-mstest-tests after the project exists.
  • The repository's current build is broken for an unrelated reason. Report that blocker; do not redesign project structure to hide it.
  • The user asks to migrate xUnit, NUnit, MSTest, TUnit, VSTest, or MTP.

Inputs

InputRequiredDescription
Repository or solution pathNoDiscover from the current workspace when omitted
Production projectNoInfer the narrowest project in the requested scope
Test frameworkNoUse an explicit choice; otherwise infer repository convention
Build entry pointNoExisting .sln, .slnx, .slnf, or project graph used by CI

Workflow

Step 1: Establish the repository contract

Inspect only the files needed to answer these questions:

  1. Which production project is in scope?
  2. What command does CI or the repository use to build and test?
  3. Does a suitable test project already reference that production project?
  4. Which test framework and runner do neighboring test projects use?
  5. Are package versions centrally managed by Directory.Packages.props, Directory.Build.props, global.json, or an MSBuild SDK declaration?
  6. Which target framework(s) must the test project compile against?

Treat a test project as suitable only when its target framework can reference the production project and its purpose matches the requested layer. Do not create a second test project merely because its name differs from your preferred name.

No-op stop condition: when a suitable project already exists and is registered in the requested build entry point, do not repair, normalize, convert, or replace the solution. If the user did not ask for tests yet, report the existing project path and stop with the workspace byte-for-byte unchanged.

Step 2: Choose one bounded project

Default to one test project per production project, named according to repository convention (Foo.Tests, Foo.UnitTests, and so on). For a vague multi-project request, start with the project that owns the user-visible behavior or has the highest-value untested logic; do not create one test project per source project without evidence that the repository wants that layout.

Match, in order:

  1. The user's explicit framework choice.
  2. Existing test projects in the same repository.
  3. Repository-wide package/SDK conventions.
  4. A standard SDK template only when the repository provides no convention.

Never mix frameworks in one test project. Never add package versions directly when central package management supplies them.

Step 3: Scaffold and reference the target

Use the matching dotnet new template (xunit, nunit, or mstest) rather than hand-writing template boilerplate. Then make only the repository-specific edits:

  1. Align target framework, nullable, implicit-usings, runner, and package style.
  2. Add a ProjectReference to each production project directly exercised by the planned tests. Do not reference every project in the solution.
  3. Remove template sample tests that do not test repository behavior.

For xUnit v3 projects that the repository runs through dotnet test, preserve or add both:

<OutputType>Exe</OutputType>
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>

OutputType=Exe alone makes the self-hosted runner work with dotnet run; it is not evidence that the repository's dotnet test command can discover the tests.

Prefer dotnet add <test-project> reference <production-project> for project references. Inspect the resulting project file before continuing.

Step 4: Register with the real build entry point

Creating a .csproj is not enough. Add it to the exact solution artifact used by the repository:

  • .sln or .slnx: dotnet sln <solution> add <test-project>
  • .slnf: add the project to the underlying solution and include it in the filter used by the requested/CI test command.
  • No solution artifact: keep the existing project-oriented workflow. Do not create a solution solely for aesthetics unless the user asked for one.

Do not substitute a different solution file because it is easier to edit.

Step 5: Add a real smoke test

Replace template examples with the smallest smoke suite requested. The tests must:

  • instantiate or invoke a real symbol from the referenced production project;
  • assert a concrete result, not only non-null/truthiness;
  • avoid network, wall-clock, process, and real filesystem dependencies.

These tests prove the project reference and discovery path. Stop after every behavior explicitly named by the user is covered; extra boundary permutations are out of scope here and belong to code-testing-agent.

Step 6: Verify direct and harness-level execution

Run, in this order:

  1. dotnet test <test-project> to isolate scaffolding failures.
  2. The repository's solution/root test command to prove CI discovery.
  3. A solution/project listing command to confirm the new project is registered.

If the direct command passes but the harness-level command discovers no new test, the scaffolding is incomplete. Fix registration before reporting success. Do not claim success from dotnet build alone.

Output Contract

Report a compact table:

RequirementEvidence
Test project created/reusedProject path
Production referenceReferenced .csproj path
Build registration.sln/.slnx/.slnf entry or project-oriented command
Test discoveryPassing harness-level command and discovered test

If validation is blocked, report the exact failing command and first actionable error. Do not describe an unrun command as successful.

Validation

  • A suitable existing test project was ruled out before creating another.
  • Framework, runner, target framework, and package style match the repository.
  • Project references cover only the production projects under test.
  • Central package management was preserved.
  • Template sample tests were removed.
  • At least one real deterministic test asserts a concrete behavior.
  • The test project passes directly.
  • The repository's solution/root command discovers and runs the new test.

Common Pitfalls

PitfallCorrective action
Creating a project that CI never seesRegister it with the exact solution/filter used by CI and run that command
Picking a favorite frameworkInfer the repository convention before using a default
Adding package versions under CPMAdd versionless references and keep versions in Directory.Packages.props
Referencing the whole solutionReference only projects whose APIs the tests compile against
Keeping UnitTest1Replace it with a concrete test of repository behavior
Creating parallel unit/integration projects from a vague askStart with one bounded project; expand only for a demonstrated boundary
Treating a green build as test discoveryRun the harness-level test command and observe the test

Frequently asked questions

What to verify before installation and use

What does the scaffold-dotnet-test-project source document cover?

Create the smallest test project that fits the repository's existing build and test conventions, wire it to the correct production project and build entry point, and prove solution-level test discovery sees it. This skill scaffolds the container for tests; it does not invent a s…

How do I install scaffold-dotnet-test-project?

The source record exposes this install command: npx skills add https://github.com/dotnet/skills --skill "plugins/dotnet-test/skills/scaffold-dotnet-test-project". Inspect the command and pinned source before running it.

Which permission-related actions were detected?

Static rules flagged read-files, exec-script in the source; the page lists the matching lines and excerpts.

Alternatives

Compare before choosing

Computed 10029,095

garrytan/gbrain

bulk-ingestion

End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.

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 1005,248

dotnet/skills

migrate-vstest-to-mtp

Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing

Computed 991,259

vipshop/cache-dit

cache-dit-model-integration

High-level guide for integrating a new DiT model into cache-dit: Cache (BlockAdapter/ForwardPattern), Context Parallelism, Tensor Parallelism, Text Encoder Parallelism (TE-P), VAE Parallelism (VAE-P), generate CLI, installation, testing workflow, and detailed references. Use when adding support for a new diffusion transformer model in cache-dit.