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.

Moq: CallBase en una interfaz implementada explícitamente.

Tengo código similar al siguiente:

public interface IBase
{
    public bool DoTest();
}
public interface ISpecific : IBase
{
    public bool DoSpecificTest();

    bool IBase.DoTest()
    {
        return this.DoSpecificTest();
    }
}

Ahora quiero escribir una prueba utilizando Moq que verifique la implementación de la función implementada explícitamente en ISpecific para llamar a DoSpecificTest().

Así que tengo un caso de prueba similar a:

public class TestISpecific 
{
    [Fact]
    public static void TestDoTest()
    {
        // Arrange
        Mock<ispecific> mock = new() { CallBase = true };

        // Act
        mock.Object.DoTest();

        // Assert
        mock.Verify(x => x.DoSpecificTest(), Times.Once);
    }
}

Pero esto no llama a la función implementada DoTest(). Entonces, ¿cómo instruyo al Mock<ispecific> mock para llamar a la función implementada y/o cómo invoco la función correcta en mock.Object? Ya que la función actual de pruebas falla al no llamar a la función correcta.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para instruir al Mock<ispecific> que llame a la función implementada, puedes usar el método Setup para configurar el comportamiento del objeto falso. En este caso, puedes configurar el comportamiento de DoTest para que llame a la función IBase.DoTest() explícitamente implementada de la siguiente manera:

    //Arrangement
    Mock<ispecific> mock = new() { CallBase = true };
    
    mock.Setup(x => ((IBase)x).DoTest()).Returns(() => x.DoSpecificTest());
    
    //Acción
    mock.Object.DoTest();
    
    //Aserción
    mock.Verify(x => x.DoSpecificTest(), Times.Once);
    

    En este código, usamos el método Setup para configurar el comportamiento de IBase.DoTest() y que retorne el resultado de DoSpecificTest() cuando se llame en el objeto falso. Utilizamos la expresión lambda () => x.DoSpecificTest() para asegurarnos de que el método no se llame hasta que sea invocado realmente.

    Con este código, el objeto falso llamará correctamente a la función implementada IBase.DoTest(), que a su vez llama a la función DoSpecificTest(), y la prueba debería pasar.

Comments are closed.