Agent skill

Writing Mstest Tests

by runceel in runceel/ReactiveProperty

Best practices for writing new MSTest 3.x/4.x unit tests and implementing concrete fixes in existing MSTest code.

MITAuto-check passedTesting & QA

Install Writing Mstest Tests

skills CLI
$ npx skills add runceel/ReactiveProperty --skill writing-mstest-tests -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install runceel/ReactiveProperty writing-mstest-tests --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/runceel/ReactiveProperty.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/writing-mstest-tests .claude/skills/writing-mstest-tests && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
writing-mstest-tests
GitHub stars
944
Token cost
~3.1k tokens
SKILL.md length
769 words
Files
1
Skills in repo
13
Repo updated
First seen
Licence
MIT

At a glance

Best practices for writing new MSTest 3.x/4.x unit tests and implementing concrete fixes in existing MSTest code.

  • Works in 7 steps: Determine project setup → Write test classes following conventions → Use modern assertion APIs → …
  • The user asks to write
  • SKILL.md covers When to Use, When Not to Use, Inputs and Workflow, plus 2 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Writing Mstest Tests is an agent skill from runceel/ReactiveProperty. Best practices for writing new MSTest 3.x/4.x unit tests and implementing concrete fixes in existing MSTest code. Use when the user asks to write, create, implement, repair, or modernize tests (including fix-it prompts such as 'something seems off, fix issues'). Primary fit for direct code changes like correcting swapped Assert.AreEqual argument order, replacing outdated assertion patterns, and converting DynamicData from IEnumerable<object[] to ValueTuple-based data sets. Covers modern assertions, data-driven…

Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering Unit testing and Failing and flaky tests. The repository describes itself as: ReactiveProperty provides MVVM and asynchronous support features under Reactive Extensions. Target frameworks are .NET 6+, .NET Framework 4.7.2 and .NET Standard 2.0. The licence is MIT.

When your agent uses it

  • The user asks to write
  • Modernize tests (including fix-it prompts such as something seems off
  • Broad test quality audits
  • Flaky-test investigations

Example prompts

  • “something seems off, fix issues”
  • “/writing-mstest-tests”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Determine project setup
  2. Write test classes following conventions
  3. Use modern assertion APIs
  4. Use data-driven tests for multiple inputs
  5. Handle test lifecycle correctly
  6. Apply cancellation and timeout patterns
  7. Use advanced features where appropriate

What it can do on your machine

Read from SKILL.md and the folder at commit e7e6474. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are csharp, xml and json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Writing Mstest Tests loads about 3.1k tokens when it runs. Until then it costs about 202 tokens; SKILL.md has 769 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~202
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from runceel/ReactiveProperty at commit e7e6474, republished under its MIT licence (© runceel). 769 words, ~3,103 tokens.

Download SKILL.mdSave it as .claude/skills/writing-mstest-tests/SKILL.md (or your agent's skills folder).
name
writing-mstest-tests
description
Best practices for writing new MSTest 3.x/4.x unit tests and implementing concrete fixes in existing MSTest code. Use when the user asks to write, create, implement, repair, or modernize tests (including fix-it prompts such as 'something seems off, fix issues'). Primary fit for direct code changes like correcting swapped Assert.AreEqual argument order, replacing outdated assertion patterns, and converting DynamicData from IEnumerable<object[]> to ValueTuple-based data sets. Covers modern assertions, data-driven tests, test lifecycle, MSTest.Sdk, sealed classes, Assert.Throws, DynamicData with ValueTuples, TestContext, and conditional execution. Do NOT use for broad test quality audits, flaky-test investigations, or test smell detection reports — use test-anti-patterns instead.
metadata.github-path
plugins/dotnet-test/skills/writing-mstest-tests
metadata.github-pinned
v1.0.0
metadata.github-ref
refs/tags/v1.0.0
metadata.github-repo
https://github.com/dotnet/skills
metadata.github-tree-sha
02ca0ad8517efa911ef1748d70b6942bcbaff7d2

Writing MSTest Tests

Help users write effective, modern unit tests with MSTest 3.x/4.x using current APIs and best practices.

When to Use

  • User wants to write new MSTest unit tests
  • User wants to improve or modernize existing MSTest tests by implementing concrete fixes
  • User asks about MSTest assertion APIs, data-driven patterns, or test lifecycle
  • User needs help fixing a specific MSTest test bug or failing assertion
  • User asks to fix swapped Assert.AreEqual argument order (expected first, actual second)
  • User asks to convert DynamicData from IEnumerable<object[]> to ValueTuple-based data

When Not to Use

  • User needs a test quality audit, anti-pattern detection, or flaky-test investigation (use test-anti-patterns)
  • User needs to run or execute tests (use the run-tests skill)
  • User needs to upgrade from MSTest v1/v2 to v3 (use migrate-mstest-v1v2-to-v3)
  • User needs to upgrade from MSTest v3 to v4 (use migrate-mstest-v3-to-v4)
  • User needs CI/CD pipeline configuration
  • User is using xUnit, NUnit, or TUnit (not MSTest)

Inputs

InputRequiredDescription
Code under testNoThe production code to be tested
Existing test codeNoCurrent tests to fix, update, or modernize
Test scenario descriptionNoWhat behavior the user wants to test

Workflow

Step 1: Determine project setup

Check the test project for MSTest version and configuration:

  • If using MSTest.Sdk (<Sdk Name="MSTest.Sdk">): modern setup, all features available
  • If using MSTest metapackage: modern setup (MSTest 3.x+)
  • If using MSTest.TestFramework + MSTest.TestAdapter: check version for feature availability

Recommend MSTest.Sdk or the MSTest metapackage for new projects:

xml
<!-- Option 1: MSTest SDK (simplest, recommended for new projects) -->
<Project Sdk="MSTest.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
  </PropertyGroup>
</Project>

When using MSTest.Sdk, put the version in global.json instead of the project file so all test projects get bumped together:

json
{
  "msbuild-sdks": {
    "MSTest.Sdk": "3.8.2"
  }
}
xml
<!-- Option 2: MSTest metapackage -->
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="MSTest" Version="3.8.2" />
  </ItemGroup>
</Project>
Step 2: Write test classes following conventions

Apply these structural conventions:

  • Seal test classes with sealed for performance and design clarity
  • Use [TestClass] on the class and [TestMethod] on test methods
  • Follow the Arrange-Act-Assert (AAA) pattern
  • Name tests using MethodName_Scenario_ExpectedBehavior
  • Use separate test projects with naming convention [ProjectName].Tests
csharp
[TestClass]
public sealed class OrderServiceTests
{
    [TestMethod]
    public void CalculateTotal_WithDiscount_ReturnsReducedPrice()
    {
        // Arrange
        var service = new OrderService();
        var order = new Order { Price = 100m, DiscountPercent = 10 };

        // Act
        var total = service.CalculateTotal(order);

        // Assert
        Assert.AreEqual(90m, total);
    }
}
Step 3: Use modern assertion APIs

Use the correct assertion for each scenario. Prefer Assert class methods over StringAssert or CollectionAssert where both exist.

Equality and null checks
csharp
Assert.AreEqual(expected, actual);      // Value equality
Assert.AreSame(expected, actual);       // Reference equality
Assert.IsNull(value);
Assert.IsNotNull(value);
Exception testing -- use Assert.Throws instead of [ExpectedException]
csharp
// Synchronous
var ex = Assert.ThrowsExactly<ArgumentNullException>(() => service.Process(null));
Assert.AreEqual("input", ex.ParamName);

// Async
var ex = await Assert.ThrowsExactlyAsync<InvalidOperationException>(
    async () => await service.ProcessAsync(null));
  • Assert.Throws<T> matches T or any derived type
  • Assert.ThrowsExactly<T> matches only the exact type T
Collection assertions
csharp
Assert.Contains(expectedItem, collection);
Assert.DoesNotContain(unexpectedItem, collection);
var single = Assert.ContainsSingle(collection);  // Returns the single element
Assert.HasCount(3, collection);
Assert.IsEmpty(collection);
Assert.IsNotEmpty(collection);

Replace generic Assert.IsTrue with specialized assertions -- they give better failure messages:

Instead ofUse
Assert.IsTrue(list.Count > 0)Assert.IsNotEmpty(list)
Assert.IsTrue(list.Count() == 3)Assert.HasCount(3, list)
Assert.IsTrue(x != null)Assert.IsNotNull(x)
list.Single(predicate) + Assert.IsNotNullAssert.ContainsSingle(list)
Assert.IsTrue(list.Contains(item))Assert.Contains(item, list)
String assertions
csharp
Assert.Contains("expected", actualString);
Assert.StartsWith("prefix", actualString);
Assert.EndsWith("suffix", actualString);
Assert.MatchesRegex(@"\d{3}-\d{4}", phoneNumber);
Type assertions
csharp
// MSTest 3.x -- out parameter
Assert.IsInstanceOfType<MyHandler>(result, out var typed);
typed.Handle();

// MSTest 4.x -- returns directly
var typed = Assert.IsInstanceOfType<MyHandler>(result);
Comparison assertions
csharp
Assert.IsGreaterThan(lowerBound, actual);
Assert.IsLessThan(upperBound, actual);
Assert.IsInRange(actual, low, high);
Step 4: Use data-driven tests for multiple inputs
DataRow for inline values
csharp
[TestMethod]
[DataRow(1, 2, 3)]
[DataRow(0, 0, 0, DisplayName = "Zeros")]
[DataRow(-1, 1, 0)]
public void Add_ReturnsExpectedSum(int a, int b, int expected)
{
    Assert.AreEqual(expected, Calculator.Add(a, b));
}
DynamicData with ValueTuples (preferred for complex data)

Prefer ValueTuple return types over IEnumerable<object[]> for type safety:

csharp
[TestMethod]
[DynamicData(nameof(DiscountTestData))]
public void ApplyDiscount_ReturnsExpectedPrice(decimal price, int percent, decimal expected)
{
    var result = PriceCalculator.ApplyDiscount(price, percent);
    Assert.AreEqual(expected, result);
}

// ValueTuple -- preferred (MSTest 3.7+)
public static IEnumerable<(decimal price, int percent, decimal expected)> DiscountTestData =>
[
    (100m, 10, 90m),
    (200m, 25, 150m),
    (50m, 0, 50m),
];

When you need metadata per test case, use TestDataRow<T>:

csharp
public static IEnumerable<TestDataRow<(decimal price, int percent, decimal expected)>> DiscountTestDataWithMetadata =>
[
    new((100m, 10, 90m)) { DisplayName = "10% discount" },
    new((200m, 25, 150m)) { DisplayName = "25% discount" },
    new((50m, 0, 50m)) { DisplayName = "No discount" },
];
Step 5: Handle test lifecycle correctly
  • Always initialize in the constructor -- this enables readonly fields and works correctly with nullability analyzers (fields are guaranteed non-null after construction)
  • Use [TestInitialize] only for async initialization, combined with the constructor for sync parts
  • Use [TestCleanup] for cleanup that must run even on failure
  • Inject TestContext via constructor (MSTest 3.6+)
csharp
[TestClass]
public sealed class RepositoryTests
{
    private readonly TestContext _testContext;
    private readonly FakeDatabase _db;  // readonly -- guaranteed by constructor

    public RepositoryTests(TestContext testContext)
    {
        _testContext = testContext;
        _db = new FakeDatabase();  // sync init in ctor
    }

    [TestInitialize]
    public async Task InitAsync()
    {
        // Use TestInitialize ONLY for async setup
        await _db.SeedAsync();
    }

    [TestCleanup]
    public void Cleanup() => _db.Reset();
}
Show full SKILL.md (282 more words)Show less
Execution order
  1. [AssemblyInitialize] -- once per assembly
  2. [ClassInitialize] -- once per class
  3. Per test:
    • With TestContext property injection: Constructor -> set TestContext property -> [TestInitialize]
    • With constructor injection of TestContext: Constructor (receives TestContext) -> [TestInitialize]
  4. Test method
  5. [TestCleanup] -> DisposeAsync -> Dispose -- per test
  6. [ClassCleanup] -- once per class
  7. [AssemblyCleanup] -- once per assembly
Step 6: Apply cancellation and timeout patterns

Always use TestContext.CancellationToken with [Timeout]:

csharp
[TestMethod]
[Timeout(5000)]
public async Task FetchData_ReturnsWithinTimeout()
{
    var result = await _client.GetDataAsync(_testContext.CancellationToken);
    Assert.IsNotNull(result);
}
Step 7: Use advanced features where appropriate
Retry flaky tests (MSTest 3.9+)

Use only for genuinely flaky external dependencies (network, file system), not to paper over race conditions or shared state issues.

csharp
[TestMethod]
[Retry(3)]
public void ExternalService_EventuallyResponds() { }
Conditional execution (MSTest 3.10+)
csharp
[TestMethod]
[OSCondition(OperatingSystems.Windows)]
public void WindowsRegistry_ReadsValue() { }

[TestMethod]
[CICondition(ConditionMode.Exclude)]
public void LocalOnly_InteractiveTest() { }
Parallelization
csharp
[assembly: Parallelize(Workers = 4, Scope = ExecutionScope.MethodLevel)]

[TestClass]
[DoNotParallelize]  // Opt out specific classes
public sealed class DatabaseIntegrationTests { }

Validation

  • Test classes are sealed
  • Test methods follow MethodName_Scenario_ExpectedBehavior naming
  • Assert.ThrowsExactly<T> used instead of [ExpectedException]
  • Specialized assertions used instead of Assert.IsTrue (e.g., Assert.IsNotNull, Assert.AreEqual)
  • DynamicData uses ValueTuple return types instead of IEnumerable<object[]>
  • Sync initialization done in the constructor, not [TestInitialize]
  • TestContext.CancellationToken passed to async calls in tests with [Timeout]
  • Project builds with zero errors and all tests pass

Common Pitfalls

PitfallSolution
Assert.AreEqual(actual, expected) -- swapped argumentsAlways put expected first: Assert.AreEqual(expected, actual). Failure messages show "Expected: X, Actual: Y" so wrong order makes messages confusing
[ExpectedException] -- obsolete, cannot assert messageUse Assert.Throws<T> or Assert.ThrowsExactly<T>
items.Single() -- unclear exception on failureUse Assert.ContainsSingle(items) for better failure messages
Hard cast (MyType)result -- unclear exceptionUse Assert.IsInstanceOfType<MyType>(result)
IEnumerable<object[]> for DynamicDataUse IEnumerable<(T1, T2, ...)> ValueTuples for type safety
Sync setup in [TestInitialize]Initialize in the constructor instead -- enables readonly fields and satisfies nullability analyzers
CancellationToken.None in async testsUse TestContext.CancellationToken for cooperative timeout
public TestContext? TestContext { get; set; }Drop the ? -- MSTest suppresses CS8618 for this property
TestContext TestContext { get; set; } = null!Remove = null! -- unnecessary, MSTest handles assignment
Non-sealed test classesSeal test classes by default for performance

© runceel, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/writing-mstest-tests of runceel/ReactiveProperty.

Open the folder on GitHubat commit e7e6474

Compare with similar skills

Writing Mstest Tests next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Writing Mstest Tests compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Writing Mstest Tests this skillrunceel/ReactiveProperty944—~3.1kAutomated safety check: PassMIT
Testing Hashqlhashintel/hash1.7k—~1.9kAutomated safety check: PassAGPL-3.0
Handsontable Unit Testinghandsontable/handsontable22k—~1.2kAutomated safety check: PassCustom licence
Frappe Testing UnitImpertio-Studio/Frappe_Claude_Skill_Package189—~3kAutomated safety check: PassMIT
Test Suite Curationpetrkindlmann/qa-skills170—~6.3kAutomated safety check: PassMIT
Ut Checkintel/torch-xpu-ops115—~1.6kAutomated safety check: PassApache-2.0

Similar skills

  • Testing Hashql

    hashintel/hash

    HashQL testing strategies including compiletest (UI tests), unit tests, and snapshot tests.

    1.7k GitHub stars~1.9k tokensUpdated today
    Testing & QAAuto-check passed
  • Handsontable Unit Testing

    handsontable/handsontable

    Conventions for Handsontable's Jest unit and TypeScript type tests: where files go, how to run them, mocking limits and when to write an E2E test instead.

    22k GitHub stars~1.2k tokensUpdated today
    Testing & QAAuto-check passed
  • Frappe Testing Unit

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests.

    189 GitHub stars~3k tokensUpdated 22 days ago
    Testing & QAAuto-check passed
  • Test Suite Curation

    petrkindlmann/qa-skills

    Audit a whole regression suite and prune/restructure it with evidence: per-test coverage fingerprinting, AST near-duplicate clustering, CI-history mining for never-failing and flaky tests, prune…

    170 GitHub stars~6.3k tokensUpdated 4 mo ago
    Testing & QAAuto-check passed
  • Ut Check

    intel/torch-xpu-ops

    Official

    Analyze UT (unit test) results for a torch-xpu-ops PR. An agent skill from intel/torch-xpu-ops.

    115 GitHub stars~1.6k tokensUpdated today
    Testing & QAAuto-check passed
  • Bug Reproduction Test Generator

    ArabelaTso/Skills-4-SE

    Automatically generates executable tests that reproduce reported bugs from issue reports and code repositories.

    253 GitHub stars~1.8k tokensUpdated 1 mo ago
    Testing & QAAuto-check passed

More from runceel/ReactiveProperty

All 13 skills in this repo
  • Msbuild Antipatterns

    runceel/ReactiveProperty

    Catalog of MSBuild anti-patterns with detection rules and fix recipes.

    944 GitHub stars~3.7k tokensUpdated 1 mo ago
    Auto-check passed
  • Binlog Failure Analysis

    runceel/ReactiveProperty

    Analyze MSBuild binary logs to diagnose build failures by replaying binlogs to searchable text logs.

    944 GitHub stars~1.1k tokensUpdated 1 mo ago
    Auto-check passed
  • Coverage Analysis

    runceel/ReactiveProperty

    Automated, project-wide code coverage and CRAP (Change Risk Anti-Patterns) score analysis for .NET projects with existing unit tests.

    944 GitHub stars~5.9k tokensUpdated 1 mo ago
    Auto-check: warnings
  • Development Workflow

    runceel/ReactiveProperty

    ReactiveProperty repository development policy. An agent skill from runceel/ReactiveProperty.

    944 GitHub stars~1.4k tokensUpdated 1 mo ago
    Auto-check passed
  • Dotnet10 Features

    runceel/ReactiveProperty

    Reference for the .NET 10 / C 14 features that are relevant to the ReactiveProperty repository.

    944 GitHub stars~2.7k tokensUpdated 1 mo ago
    Auto-check passed
  • Migrate Vstest To Mtp

    runceel/ReactiveProperty

    Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP).

    944 GitHub stars~4.3k tokensUpdated 1 mo ago
    Auto-check passed

Categories

Questions about Writing Mstest Tests

What does Writing Mstest Tests do?

Best practices for writing new MSTest 3.x/4.x unit tests and implementing concrete fixes in existing MSTest code. Writing Mstest Tests is an agent skill from runceel/ReactiveProperty.x unit tests and implementing concrete fixes in existing MSTest code.

When should I use Writing Mstest Tests?

Writing Mstest Tests fits situations like: the user asks to write; modernize tests (including fix-it prompts such as something seems off; broad test quality audits; flaky-test investigations.

How do I install Writing Mstest Tests in Claude Code?

Run `npx skills add runceel/ReactiveProperty --skill writing-mstest-tests -a claude-code`. Or copy the skill folder (.agents/skills/writing-mstest-tests in runceel/ReactiveProperty) into .claude/skills/writing-mstest-tests in your project. Claude Code loads it when a task matches its description.

How do I install Writing Mstest Tests in Codex?

Run `npx skills add runceel/ReactiveProperty --skill writing-mstest-tests -a codex`. Or copy the skill folder (.agents/skills/writing-mstest-tests in runceel/ReactiveProperty) into .agents/skills/writing-mstest-tests in your project. Codex loads it when a task matches its description.

Can I use Writing Mstest Tests in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add runceel/ReactiveProperty --skill writing-mstest-tests -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/writing-mstest-tests, .gemini/skills/writing-mstest-tests, .github/skills/writing-mstest-tests and .opencode/skills/writing-mstest-tests in your project.

What does Writing Mstest Tests need to run?

SKILL.md names no scripts, command-line tools or credentials: Writing Mstest Tests is instructions for the agent only.

Does Writing Mstest Tests access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Writing Mstest Tests safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Writing Mstest Tests use?

Writing Mstest Tests is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Writing Mstest Tests use?

About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Writing Mstest Tests?

Skills that share tags, products or a category with Writing Mstest Tests: Testing Hashql (hashintel/hash, 1.7k stars), Handsontable Unit Testing (handsontable/handsontable, 22k stars), Frappe Testing Unit (Impertio-Studio/Frappe_Claude_Skill_Package, 189 stars) and Test Suite Curation (petrkindlmann/qa-skills, 170 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Writing Mstest Tests?

runceel (a GitHub user) maintains it in runceel/ReactiveProperty, which has 944 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on August 31, 2026.

Source: runceel/ReactiveProperty on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.