Moq verificar con parámetro de objeto

86

Estoy tratando de verificar un parámetro que es una clase. El código que se está probando está bien. El error está en la prueba.

He probado dos métodos, y ambos han fallado.

Aquí están mis intentos:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));

Esto siempre falla, aunque un objeto pasado como segundo parámetro tenga las mismas propiedades. El primer parámetro está bien verificado.

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );

Esto siempre pasa, incluso cuando debería fallar. Las afirmaciones en la devolución de llamada fallan, pero la excepción no se pasa al contexto externo y, por lo tanto, la prueba siempre pasa.

¿Puedes ayudarme a encontrar lo que estoy haciendo mal?

Rhughes
fuente

Respuestas:

138

El primer intento está más cerca de lo que quieres lograr.

La razón por la que falla es que Moq (probablemente) usa Object.Equalsbajo la cubierta para probar si el ImageFilterOptionsparámetro con el que se llamó al método es la misma instancia que la que proporcionó en la llamada Verify.

Es imposible que sean la misma instancia, porque en Verifytu creas un new ImageFilterOptions().

En lugar de realizar la verificación de parámetros de esta manera, puede usar la It.Issintaxis de Moq para proporcionar una expresión que verifique que el parámetro es el esperado.

En su caso, desea verificar que el parámetro sea de tipo ImageFilterOptionsy que tanto the Widthcomo the Heightestén configurados en 256. La expresión que te permite hacer eso es:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)

Entonces, su llamada a Verifypodría verse así:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
Cristian Lupascu
fuente
1
La sintaxis que tenía que uso sería: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). No había genéricoIs
Stanislav
1
La versión genérica funciona para mí y está en los documentos API nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - ¿Está usando una versión desactualizada de Moq?
Tim Abell