es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Método estático void de UnitTest de C#

Estoy tratando de hacer una prueba de unidad para un registrador en una aplicación. Por ejemplo, necesito probar el método Logger.info("algún mensaje"), pero este método es estático y no devuelve nada. Buscando en Google entendí que debo usar Moq pero no puedo implementarlo en la clase UnitTest. El constructor de Logger no tiene un argumento y en x.Debug tengo un error que dice que no puedo acceder desde la referencia de instancia. ¿Hay alguna manera de implementar UnitTest sin editar el código de producción?

[TestClass()]
public class LoggerTests
{
    [TestMethod()]
    public void DebugTest()
    { 
        var mock = new Mock<logger>();
        mock.Setup(x => x.Debug(It.IsAny<string>());
        new Logger(mock.Object).AddLog("pruebas");
        mock.VerifyAll;
    }
}

Program.cs

private static void ConfigureLogger()
{
    Logger.AddLog(new NLogAppender());
    Logger.Level = TraceLevel.Verbose;
    Logger.Info("Configured Logger");
}

Logger.cs

public class Logger
{
    public static readonly List<iappender> loggings = new List<iappender>();

    public static void AddLog(IAppender appender)
    {
        loggings.Add(appender);
    }

    public static TraceLevel Level { get; set; }

    static Logger()
    {
        Level = TraceLevel.Verbose;
    }

    public static void Info(string message)
    {
        LogMessage(message);
    }
}

NlogAppender.cs

public class NLogAppender : IAppender
{
    public NLog.Logger logger;

    public NLogAppender()
    {
        logger = LogManager.GetLogger(nameof(NLogAppender));
    }

    public void AddLog(string str)
    {
    }
}

IAppender.cs

public interface IAppender
{
void AddLog(string str);
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Pruebas Unitarias de un Método Estático Void en una Aplicación de Registro en C#

    Cuando se trata de realizar pruebas unitarias en un método estático void en C#, los frameworks de mocking como Moq pueden ser muy útiles. Aquí hay un ejemplo de una prueba unitaria para probar el método Logger.Info():

    [TestClass()]
    public class LoggerTests
    {
        [TestMethod()]
        public void InfoTest()
        {
            // Arrange
            var mockAppender = new Mock<iappender>();
    
            // Act
            Logger.AddLog(mockAppender.Object);
            Logger.Info("algún mensaje");
    
            // Assert
            mockAppender.Verify(x => x.AddLog("algún mensaje"), Times.Once);
        }
    }
    

    En este ejemplo, primero creamos un objeto simulado de tipo IAppender utilizando Moq. Luego, agregamos este objeto simulado a la lista de registros del registro utilizando Logger.AddLog(). A continuación, llamamos al método Logger.Info() con un mensaje de prueba.

    Finalmente, verificamos que se haya llamado al método AddLog() en el objeto simulado con el mensaje esperado.

    Es esencial destacar que hemos implementado la prueba unitaria sin realizar cambios en el código de producción y hemos probado exitosamente el método del registro.

Comments are closed.