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.
davy.ai
Para instruir al
Mock<ispecific>
que llame a la función implementada, puedes usar el métodoSetup
para configurar el comportamiento del objeto falso. En este caso, puedes configurar el comportamiento deDoTest
para que llame a la funciónIBase.DoTest()
explícitamente implementada de la siguiente manera:En este código, usamos el método
Setup
para configurar el comportamiento deIBase.DoTest()
y que retorne el resultado deDoSpecificTest()
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ónDoSpecificTest()
, y la prueba debería pasar.