Saltar al contenido

Burlarse de métodos genéricos en Moq sin especificar T

Solución:

Simplemente haz esto:

[TestMethod]
public void ExampleTest()
{
  var mock = new Mock<IRepo> { DefaultValue = DefaultValue.Mock, };
  // no setups needed!

  ...
}

Ya que tu simulacro no tiene comportamiento Strict, estará feliz con las llamadas que ni siquiera ha configurado. En ese caso, simplemente se devuelve un “predeterminado”. Luego

DefaultValue.Mock

asegura que este “predeterminado” sea un nuevo Mock<> del tipo apropiado, en lugar de solo una referencia nula.

La limitación aquí es que no puede controlar (por ejemplo, realizar configuraciones especiales en) las “subimitaciones” individuales que se devuelven.

En Moq 4.13 introdujeron el tipo It.IsAnyType que puede usar para simular métodos genéricos. P.ej

public interface IFoo
{
    bool M1<T>();
    bool M2<T>(T arg);
}

var mock = new Mock<IFoo>();
// matches any type argument:
mock.Setup(m => m.M1<It.IsAnyType>()).Returns(true);

// matches only type arguments that are subtypes of / implement T:
mock.Setup(m => m.M1<It.IsSubtype<T>>()).Returns(true);

// use of type matchers is allowed in the argument list:
mock.Setup(m => m.M2(It.IsAny<It.IsAnyType>())).Returns(true);
mock.Setup(m => m.M2(It.IsAny<It.IsSubtype<T>>())).Returns(true);

A menos que no entienda bien lo que necesita, podría crear un método como este:

private Mock<IRepo> MockObject<T>()
{
    var mock = new Mock<IRepo>();
    return mock.Setup(pa => pa.Reserve<T>())
        .Returns(new Mock<IA<T>>().Object).Object;
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *