Skip to content

Testing

viamu edited this page Mar 1, 2026 · 3 revisions

🧪 Testing

Test Stack

Tool Purpose
xUnit Test framework
NSubstitute Mocking library
FluentAssertions Assertion library

▶️ Running Tests

# Run all tests
dotnet test

# Run with verbose output
dotnet test --verbosity normal

# Run a specific test class
dotnet test --filter "FullyQualifiedName~CollectionParserTests"

# Run tests from a specific namespace
dotnet test --filter "Namespace~CodeGenesis.Engine.Tests.Claude"

📊 Test Coverage

Test Class Target Tests
UsePipelineStepTests Sub-pipeline execution, input mapping, output merging, circular detection 20
DynamicStepTests Success/failure execution, retry, rate limit, fail_if, clone 20
PipelineConfigLoaderTests Template resolution, YAML loading, validation 20
ClaudeResponseTests JSON parsing, FailureKind classification, Failure factory 15
CollectionParserTests JSON array, comma-separated, newline-separated, fallbacks 12
StepEntryTests Discriminators (IsSimpleStep, IsForeach, etc.), ToStepConfig 11
McpServerConfigTests Template resolution, immutability 10
McpContextBuilderTests MCP tools section generation for system prompts 9
PipelineContextTests Initialization, metrics accumulation, step outputs 6
StepResultTests Record equality, outcome values 6
RetryPolicyTests Cascading resolution (step → global → defaults) 4
Total 133

🔄 CI

Tests run automatically via GitHub Actions on every push to main and on pull requests.

CI

The workflow:

  1. ☑️ Sets up .NET 10 SDK (10.0.103)
  2. ☑️ Restores dependencies
  3. ☑️ Builds in Release configuration
  4. ☑️ Runs all tests

✍️ Writing New Tests

Conventions

Convention Example
File location Mirror source namespace (Claude/, Config/, Pipeline/, Steps/)
Test naming MethodName_Scenario_ExpectedResult
Mocking Use NSubstitute for interfaces (IClaudeRunner, IStepExecutor)
Assertions Use FluentAssertions (result.Should().Be(...))

Example

[Fact]
public async Task ExecuteAsync_Success_ReturnsSuccessResult()
{
    // Arrange
    _claude.RunAsync(Arg.Any<ClaudeRequest>(), Arg.Any<CancellationToken>())
        .Returns(new ClaudeResponse
        {
            Success = true,
            Result = "done!",
            InputTokens = 100,
            OutputTokens = 50,
            CostUsd = 0.01,
            Duration = TimeSpan.FromSeconds(2)
        });

    var step = MakeStep();
    var ctx = MakeContext();

    // Act
    var result = await step.ExecuteAsync(ctx, CancellationToken.None);

    // Assert
    result.Outcome.Should().Be(StepOutcome.Success);
    result.Output.Should().Be("done!");
}

Tip

When testing steps that depend on IClaudeRunner, use NSubstitute.Returns() to simulate different Claude responses (success, timeout, rate limit, max_turns, etc.).

🧬 CodeGenesis

🏠 Home


📘 Guides

📋 Pipeline

🔧 Internals


CI

Clone this wiki locally