Files
Leonid Pershin b816eb5aaf clear deps
2025-10-17 06:29:23 +03:00

85 lines
2.4 KiB
C#

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Moq;
namespace ChatBot.Tests.TestUtilities;
/// <summary>
/// Base class for integration tests with common setup
/// </summary>
public abstract class TestBase : IDisposable
{
private bool _disposed;
protected IServiceProvider ServiceProvider { get; private set; } = null!;
protected Mock<ILogger> LoggerMock { get; private set; } = null!;
protected virtual void SetupServices()
{
var services = new ServiceCollection();
// Add logging
LoggerMock = new Mock<ILogger>();
services.AddSingleton(LoggerMock.Object);
services.AddLogging(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Debug));
// Add other common services
ConfigureServices(services);
ServiceProvider = services.BuildServiceProvider();
}
protected abstract void ConfigureServices(IServiceCollection services);
protected virtual void Dispose(bool disposing)
{
if (!_disposed && disposing && ServiceProvider is IDisposable disposable)
{
disposable.Dispose();
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
/// <summary>
/// Base class for unit tests with common assertions
/// </summary>
public abstract class UnitTestBase
{
protected static void AssertLogMessage(Mock<ILogger> loggerMock, LogLevel level, string message)
{
loggerMock.Verify(
x =>
x.Log(
level,
It.IsAny<EventId>(),
It.Is<It.IsAnyType>((v, t) => v.ToString()!.Contains(message)),
It.IsAny<Exception>(),
It.IsAny<Func<It.IsAnyType, Exception?, string>>()
),
Times.AtLeastOnce
);
}
protected static void AssertLogError(Mock<ILogger> loggerMock, string message)
{
AssertLogMessage(loggerMock, LogLevel.Error, message);
}
protected static void AssertLogWarning(Mock<ILogger> loggerMock, string message)
{
AssertLogMessage(loggerMock, LogLevel.Warning, message);
}
protected static void AssertLogInformation(Mock<ILogger> loggerMock, string message)
{
AssertLogMessage(loggerMock, LogLevel.Information, message);
}
}