mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-04 02:25:28 +08:00 
			
		
		
		
	* TestConsole can now be configured and accessed in CommandAppTester * Add test with mocked user inputs for interactive command * Add documentation for using the CommandAppTester Co-authored-by: Patrik Svensson <patriksvensson@users.noreply.github.com> Co-authored-by: Marek Magath <Marek.Magath@solarwinds.com>
This commit is contained in:
		@@ -63,6 +63,90 @@ The following example validates the exit code and terminal output of a `Spectre.
 | 
			
		||||
    }
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The following example demonstrates how to mock user inputs for an interactive command.
 | 
			
		||||
This test (InteractiveCommand_WithMockedUserInputs_ProducesExpectedOutput) simulates user interactions by pushing predefined inputs to the console, then verifies that the resulting output is as expected.
 | 
			
		||||
 | 
			
		||||
```csharp
 | 
			
		||||
public sealed class InteractiveCommandTests
 | 
			
		||||
{
 | 
			
		||||
    private sealed class InteractiveCommand : Command
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IAnsiConsole _console;
 | 
			
		||||
 | 
			
		||||
        public InteractiveCommand(IAnsiConsole console)
 | 
			
		||||
        {
 | 
			
		||||
            _console = console;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int Execute(CommandContext context)
 | 
			
		||||
        {
 | 
			
		||||
            var fruits = _console.Prompt(
 | 
			
		||||
                new MultiSelectionPrompt<string>()
 | 
			
		||||
                    .Title("What are your [green]favorite fruits[/]?")
 | 
			
		||||
                    .NotRequired() // Not required to have a favorite fruit
 | 
			
		||||
                    .PageSize(10)
 | 
			
		||||
                    .MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]")
 | 
			
		||||
                    .InstructionsText(
 | 
			
		||||
                        "[grey](Press [blue]<space>[/] to toggle a fruit, " +
 | 
			
		||||
                        "[green]<enter>[/] to accept)[/]")
 | 
			
		||||
                    .AddChoices(new[] {
 | 
			
		||||
                        "Apple", "Apricot", "Avocado",
 | 
			
		||||
                        "Banana", "Blackcurrant", "Blueberry",
 | 
			
		||||
                        "Cherry", "Cloudberry", "Coconut",
 | 
			
		||||
                    }));
 | 
			
		||||
 | 
			
		||||
            var fruit = _console.Prompt(
 | 
			
		||||
                new SelectionPrompt<string>()
 | 
			
		||||
                    .Title("What's your [green]favorite fruit[/]?")
 | 
			
		||||
                    .PageSize(10)
 | 
			
		||||
                    .MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]")
 | 
			
		||||
                    .AddChoices(new[] {
 | 
			
		||||
                        "Apple", "Apricot", "Avocado",
 | 
			
		||||
                        "Banana", "Blackcurrant", "Blueberry",
 | 
			
		||||
                        "Cherry", "Cloudberry", "Cocunut",
 | 
			
		||||
                    }));
 | 
			
		||||
 | 
			
		||||
            var name = _console.Ask<string>("What's your name?");
 | 
			
		||||
 | 
			
		||||
            _console.WriteLine($"[{string.Join(',', fruits)};{fruit};{name}]");
 | 
			
		||||
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    public void InteractiveCommand_WithMockedUserInputs_ProducesExpectedOutput()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        TestConsole console = new();
 | 
			
		||||
        console.Interactive();
 | 
			
		||||
 | 
			
		||||
        // Your mocked inputs must always end with "Enter" for each prompt!
 | 
			
		||||
 | 
			
		||||
        // Multi selection prompt: Choose first option
 | 
			
		||||
        console.Input.PushKey(ConsoleKey.Spacebar);
 | 
			
		||||
        console.Input.PushKey(ConsoleKey.Enter);
 | 
			
		||||
 | 
			
		||||
        // Selection prompt: Choose second option
 | 
			
		||||
        console.Input.PushKey(ConsoleKey.DownArrow);
 | 
			
		||||
        console.Input.PushKey(ConsoleKey.Enter);
 | 
			
		||||
 | 
			
		||||
        // Ask text prompt: Enter name
 | 
			
		||||
        console.Input.PushTextWithEnter("Spectre Console");
 | 
			
		||||
 | 
			
		||||
        var app = new CommandAppTester(null, new CommandAppTesterSettings(), console);
 | 
			
		||||
        app.SetDefaultCommand<InteractiveCommand>();
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        var result = app.Run();
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        result.ExitCode.ShouldBe(0);
 | 
			
		||||
        result.Output.EndsWith("[Apple;Apricot;Spectre Console]");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Testing console behaviour
 | 
			
		||||
 | 
			
		||||
 `TestConsole` and `TestConsoleInput` are testable implementations of `IAnsiConsole` and `IAnsiConsoleInput`, allowing you fine-grain control over testing console output and interactivity.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user