csharp-moq4

Cómo crear mocks para testing en C# con Moq4

Moq4 es una bibliotecas más populares para el enmascaramiento de objetos o “mocks” en .NET.

Los objetos “enmascarados” o, como los llamamos normalmente “mocks”, son objetos ficticios que empleamos generalmente durante la fase de testing.

Al realizar pruebas unitarias de código encontraremos que, muchas veces, dependemos de objetos de terceros. Emplear estos objetos nos impide testear nuestro código de forma independiente o unitaria.

La solución habitual es crear un objeto ficticio que emplearemos en nuestro test, y que simula el comportamiento del objeto real, pero acotado y determinado.

Cómo usar Moq4

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package Moq

Ahora, supongamos que tenemos un interface

public interface IMiClase
{
    string Name { get; set; }
    int Value { get; set; }
    bool DoSomething(string value);
    int GetValue();

Podemos crear un Mock de IMiClase haciendo

var mock = new Mock<IMiClase>();
mock.Setup(x => x.DoSomething("something")).Returns(true);
mock.Setup(x => x.GetValue()).Returns(5);

Con esto acabamos de hacer que nuestro objeto ‘mock’ que implementa IMiClase, y que tiene un método DoSomething que al ser llamado con el parámetro ‘something’ devuelve true.

Ahora podemos usar este objeto en nuestros Test, sin tener un objeto “Real” que implemente IMiClase, si no algo que simula serlo (un Mock).

[Fact]
public void TestMethod()
{
	var mock = new Mock<IMiClase>();
	mock.Setup(x => x.DoSomething("something")).Returns(true);
	mock.Setup(x => x.GetValue()).Returns(5);

	var result = myClass.GetValue();
	Assert.Equal(5, result);
}

Por supuesto, Moq4 tiene muchísimas opciones para enmascarar cualquier comportamiento. Por ejemplo

  • Propiedades
  • Métodos sincronos o asíncronos
  • Parámetros pasados a los métodos
  • Herencia
  • Eventos y callbacks

En general, prácticamente cualquier comportamiento puede enmascarado o “mockeado”. De hecho, posiblemente tiene opciones que ni vayáis a usar nunca.

Podéis ver todas las opciones disponibles en la documentación del proyecto, en especial en la sección QuickStart que tiene un montón de ejemplos sobre como usar Moq4.