Как я могу построить приложение для консоли .NET, чтобы оно легко проверить [закрыто]C#

Место общения программистов C#
Anonymous
 Как я могу построить приложение для консоли .NET, чтобы оно легко проверить [закрыто]

Сообщение Anonymous »

После проверки примеров и запроса некоторых LLMS для предложений я предложил следующую структуру класса программы, чтобы позволить моему приложению консоли .NET быть тестируемым. < /p>

Код: Выделить всё

class Program
{
internal static async Task RunAsync(IServiceProvider? serviceProvider = null)
{
ArgumentNullException.ThrowIfNull(serviceProvider);

var entryClass = serviceProvider.GetService();
ArgumentNullException.ThrowIfNull(entryClass);
await entryClass.ExecuteAsync();

return 0;
}

static string[] MapShortFlagsToLong(string[] args)
{
var flagMappings = new Dictionary
{
{ "-o1", "--option1" },
{ "-o2", "--option2" },
};

return args.Select(arg => flagMappings.TryGetValue(arg.ToLower(), out var longName) ? $"{longName}=true" : $"{arg}=true").ToArray();
}
static IServiceProvider ConfigureServices(string[] args)
{
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty;

var mappedArgs = MapShortFlagsToLong(args);
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.json", true, true)
.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.Local.json", optional: true, reloadOnChange: true)
.AddCommandLine(mappedArgs)
.Build();

var services = new ServiceCollection();

services.Configure(config);
services.Configure(config);

services.AddSingleton();
... other registrations

return services.BuildServiceProvider();
}
static async Task Main(string[] args)
{
var serviceProvider = ConfigureServices(args);
int exitCode = await RunAsync(serviceProvider);
Environment.ExitCode = exitCode;
}
}
< /code>
Мой тестовый проект будет иметь доступ к методу Runasync, и мои методы испытаний будут такими, как это: < /p>
[Fact]
public async Task RunAsync_Should_Use_MockedEntryClass()
{
var services = new ServiceCollection();
var mockEntryClass = Substitute.For();
services.AddSingleton(mockEntryClass);
var serviceProvider = services.BuildServiceProvider();

var result =  await Program.RunAsync(serviceProvider);

Assert.Equal(0, result);
}
Таким образом, класс тестирования должен вызвать метод Runasync и предоставить макет для всех регистраций.
Как я могу улучшить свою консоли. Структура приложения, чтобы сделать его легко тестируемым?

Подробнее здесь: https://stackoverflow.com/questions/794 ... y-testable

Вернуться в «C#»