基于 SOC 职业分类
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Pyfagorass/bookofspells --skill githubcopilot-csharp-tunit命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
The index to a Book of Spells — a large, curated library of ready-made spells (skills in the SKILL.md format) gathered from many providers (Google, OpenAI, and more), covering cloud platforms, deployment, design tools, PDFs, browser automation, security, and much else. The spells are NOT preloaded — there may be thousands. Use this whenever the user asks to cast a spell, or for a spell to do something, or names a capability, provider, or tool you do not already have loaded (e.g. "cast a spell for Figma", "is there a spell for deploying?", "use the bigquery spell"), or whenever a task might be served by a specialised, ready-made spell. Casting a spell MEANS consulting this index to discover and load the right one on demand — do that first, rather than improvising. This is also the single entry point to the Book's own keystones: route here to AUTHOR a new spell (the-spellwright), to FIND or CONNECT an MCP server / external tool (the-emissary), or to INSTALL the Book into a conduit (the-tether).
How to install this Book of Spells into a conduit so its gathered skills become usable — by symlink, not by copy. Use whenever the user wants to install, set up, enable, add, or "load" the Book's spells into their agent; asks where skills go or how a conduit finds them; or asks how to keep the spells up to date. The companion to the-grimoire (which *finds* spells once they are installed): this one *shelves the Book* so the grimoire has something to find.
Find and connect an MCP server — an "Emissary of the Pact" — when the agent needs a tool, service, API, or data source it does not already have. Use when the user asks for an MCP server, to connect to or integrate an external service (Notion, GitHub, Figma, a database, Slack, a SaaS API…), asks "is there an MCP for X", "add an MCP", or sets a task that needs live tools the agent lacks. This rite DISCOVERS a server from the official MCP Registry and reputable directories and PROPOSES its connection config for the user to approve — it NEVER installs, launches, or writes credentials on its own. The companion to the-grimoire: that finds spells (inert skills); this finds Emissaries (live tool-servers).
| name | githubcopilot-csharp-tunit |
| description | Get best practices for TUnit unit testing, including data-driven tests |
Your goal is to help me write effective unit tests with TUnit, covering both standard and data-driven testing approaches.
[ProjectName].TestsCalculatorTests for Calculator)dotnet test for running tests[Test] attribute for test methods (not [Fact] like xUnit)MethodName_Scenario_ExpectedBehavior[Before(Test)] for setup and [After(Test)] for teardown[Before(Class)] and [After(Class)] for shared context between tests in a class[Before(Assembly)] and [After(Assembly)] for shared context across test classes[Before(TestSession)] and [After(TestSession)]await Assert.That()[DependsOn] attribute if needed)[Arguments] attribute for inline test data (equivalent to xUnit's [InlineData])[MethodData] for method-based test data (equivalent to xUnit's [MemberData])[ClassData] for class-based test dataITestDataSource[Arguments] attributes can be applied to the same test methodawait Assert.That(value).IsEqualTo(expected) for value equalityawait Assert.That(value).IsSameReferenceAs(expected) for reference equalityawait Assert.That(value).IsTrue() or await Assert.That(value).IsFalse() for boolean conditionsawait Assert.That(collection).Contains(item) or await Assert.That(collection).DoesNotContain(item) for collectionsawait Assert.That(value).Matches(pattern) for regex pattern matchingawait Assert.That(action).Throws<TException>() or await Assert.That(asyncAction).ThrowsAsync<TException>() to test exceptions.And operator: await Assert.That(value).IsNotNull().And.IsEqualTo(expected).Or operator for alternative conditions: await Assert.That(value).IsEqualTo(1).Or.IsEqualTo(2).Within(tolerance) for DateTime and numeric comparisons with tolerance[Repeat(n)] to repeat tests multiple times[Retry(n)] for automatic retry on failure[ParallelLimit<T>] to control parallel execution limits[Skip("reason")] to skip tests conditionally[DependsOn(nameof(OtherTest))] to create test dependencies[Timeout(milliseconds)] to set test timeouts[Category("CategoryName")] for test categorization[DisplayName("Custom Test Name")] for custom test namesTestContext for test diagnostics and information[WindowsOnly] for platform-specific tests[NotInParallel] to disable parallel execution for specific tests[ParallelLimit<T>] with custom limit classes to control concurrency[Repeat(n)] with [ParallelLimit<T>] for load testing scenarios[Fact] with [Test][Theory] with [Test] and use [Arguments] for data[InlineData] with [Arguments][MemberData] with [MethodData]Assert.Equal with await Assert.That(actual).IsEqualTo(expected)Assert.True with await Assert.That(condition).IsTrue()Assert.Throws<T> with await Assert.That(action).Throws<T>()[Before(Test)]/[After(Test)]IClassFixture<T> with [Before(Class)]/[After(Class)]Why TUnit over xUnit?
TUnit offers a modern, fast, and flexible testing experience with advanced features not present in xUnit, such as asynchronous assertions, more refined lifecycle hooks, and improved data-driven testing capabilities. TUnit's fluent assertions provide clearer and more expressive test validation, making it especially suitable for complex .NET projects.