39 lines
1.2 KiB
C#
39 lines
1.2 KiB
C#
using System.CommandLine;
|
||
|
||
namespace Gpulse.WCT.DataAnalyzer.Tests;
|
||
|
||
/// <summary>
|
||
/// 命令执行辅助:运行命令并捕获标准输出/标准错误。
|
||
/// 命令 handler 直接使用 Console.WriteLine,因此重定向 System.Console 即可捕获;
|
||
/// System.CommandLine 自身的帮助/校验输出也会经默认控制台写入同一流。
|
||
/// </summary>
|
||
public static class CliTestExtensions
|
||
{
|
||
/// <summary>
|
||
/// 执行命令并返回 (退出码, 标准输出, 标准错误)。
|
||
/// </summary>
|
||
public static async Task<(int ExitCode, string StdOut, string StdErr)> RunCaptureAsync(
|
||
this Command command,
|
||
params string[] args)
|
||
{
|
||
var originalOut = Console.Out;
|
||
var originalError = Console.Error;
|
||
|
||
using var outWriter = new StringWriter();
|
||
using var errWriter = new StringWriter();
|
||
|
||
Console.SetOut(outWriter);
|
||
Console.SetError(errWriter);
|
||
try
|
||
{
|
||
var exitCode = await command.InvokeAsync(args);
|
||
return (exitCode, outWriter.ToString(), errWriter.ToString());
|
||
}
|
||
finally
|
||
{
|
||
Console.SetOut(originalOut);
|
||
Console.SetError(originalError);
|
||
}
|
||
}
|
||
}
|