Skip to content

Testing Prompts#

Note

If you're using CommandDotNet.Spectre (recommended) use the AnsiTestConsole from the CommandDotNet.Spectre.Testingpackage to test the IAnsiConsole features work as expected. See examples in the linked doc as these examples will not work with Spectre.

Prompts

Prompts are easily tested using the Resond methods to provide Answers for the OnPrompt value.

Notice Respond.WithText in the examples below.

public class PipedInputTests
{
    [Test]
    public void PipedInput_Should_UnionWithUserSuppliedValues()
    {
        var result = new AppRunner<App>()
            .UsePrompter()
            .RunInMem("TellAJoke", onPrompt: Respond.WithText("who's there"));

        result.ExitCode.Should().Be(0);
        result.Console.Out.Should().Be(@"knock knock: who's there
who's there
");
    }
}

private class App
{
    public void TellAJoke(IConsole console, IPrompter prompter)
    {
        var answer = prompter.PromptForValue("knock knock", out _);
        console.Out.WriteLine(answer);
    }
}
public void InjectedPrompterCanPromptForValues()
{
    new AppRunner<App>()
        .UsePrompter()
        .Verify(new Scenario
        {
            When = 
            {
                Args = "TellAJoke",
                OnPrompt = Respond.WithText("who's there")
            },
            Then =
            {
                Output = @"knock knock: who's there
who's there
"
            }
        });
}

private class App
{
    public void TellAJoke(IConsole console, IPrompter prompter)
    {
        var answer = prompter.PromptForValue("knock knock", out _);
        console.Out.WriteLine(answer);
    }
}
public class PipedInputTests
{
    [Test]
    public void PipedInput_Should_UnionWithUserSuppliedValues()
    {
        var promptResponder = Respond.WithText("who's there");
        var testConsole = new TestConsole(onReadKey: promptResponder.OnReadKey);
        var appRunner = new AppRunner<App>()
            .Configure(c => c.Console = testConsole);

        // remaining test code
    }
}

Use this same pattern when verifying prompts as expected for missing arguments.

For more examples, see our prompting tests

Respond#

The Respond class has several helper methods. They all return an IPromptResponder populated with one or more IAnswers.

IAnswers have the follwing properties:

  • ConsoleKeys: the ConsoleKeyInfos to return.
  • Reuse: when false, the Answer will be discarded after first use.
  • PromptFilter: a predicate to determine if the answer should be used.
    • The last line of the console output is used the value passed to the predicate.
  • ShouldFail: when true, a UnexpectedPromptFailureException will be thrown

Respond.WithText#

Respond.WithText converts a text string to a collection of ConsoleKeyInfos.

Optional paramaters: promptFilter and reuse

Respond.WithList#

Respond.WithList converts a collection of text strings to a collection of ConsoleKeyInfos

OnPrompt = Respond.WithList(new []{"a","b","c"});

Optional paramaters: promptFilter and reuse

Respond.With(Answers)#

Respond.With is used when more than one prompt answer is required.

OnPrompt = Respond.With(
    new TextAnswer("groceries", 
        prompt => prompt == "enter list name:"),
    new ListAnswer(new[] {"apples", "bananas", "cherries"},
        prompt => prompt == "enter items:"))

Respond.FailOnPrompt#

Respond.FailOnPrompt creates an answer with ShouldFail=true, resulting in a UnexpectedPromptFailureException on prompt.

Optional paramaters: promptFilter