Testing Prompts#
Note
If you're using CommandDotNet.Spectre (recommended) use the AnsiTestConsole
from the CommandDotNet.Spectre.Testing
package 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 Answer
s 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 IAnswer
s.
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