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?

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

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,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.