Moq verificar com parâmetro de objeto

86

Estou tentando verificar um parâmetro que é uma classe. O código que está sendo testado está bom. O bug está em teste.

Tentei dois métodos, mas ambos falharam.

Aqui estão minhas tentativas:

1:

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

Isso sempre falha, embora um objeto passado como o segundo parâmetro tenha propriedades iguais. O primeiro parâmetro é verificado corretamente.

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");
        }
    );

Isso sempre passa, mesmo quando deveria falhar. Os Asserts no retorno de chamada falham, mas a exceção não é passada para o contexto externo e, portanto, o teste sempre passa.

Você pode me ajudar a descobrir o que estou fazendo de errado?

Rhughes
fonte

Respostas:

138

A primeira tentativa está mais perto do que você deseja alcançar.

O motivo da falha é que o Moq (provavelmente) usa Object.Equalso disfarce para testar se o ImageFilterOptionsparâmetro com o qual o método foi chamado é a mesma instância que você forneceu na chamada Verify.

É impossível que sejam a mesma instância, porque em Verifyvocê cria um new ImageFilterOptions().

Em vez de realizar a verificação do parâmetro dessa forma, você pode usar a It.Issintaxe do Moq para fornecer uma expressão que verifica se o parâmetro é o esperado.

No seu caso, você deseja verificar se o parâmetro é do tipo ImageFilterOptionse se tanto o Widthquanto o Heightestão configurados para 256. A expressão que permite que você faça isso é:

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

Portanto, sua chamada para Verifypoderia ser assim:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
Cristian Lupascu
fonte
1
A sintaxe que eu tinha de uso seria: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). Não havia genéricoIs
Stanislav
1
A versão genérica funciona para mim e está nos documentos da API nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - você está usando uma versão desatualizada do Moq?
Tim Abell,