Moq verifica con parametro oggetto


86

Sto cercando di verificare un parametro che è una classe. Il codice da testare va bene. Il bug è nel test.

Ho provato due metodi, entrambi falliti.

Ecco i miei tentativi:

1:

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

Ciò non riesce sempre, anche se un oggetto passato come secondo parametro ha proprietà uguali. Il primo parametro è verificato bene.

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

Questo passa sempre, anche quando dovrebbe fallire. Le asserzioni nella richiamata falliscono, ma l'eccezione non viene passata al contesto esterno e quindi il test viene sempre superato.

Puoi aiutarmi a scoprire cosa sto facendo di sbagliato?

Risposte:


139

Il primo tentativo è più vicino a ciò che vuoi ottenere.

Il motivo per cui fallisce è che Moq (probabilmente) usa Object.Equalssotto copertura per verificare se il ImageFilterOptionsparametro con cui è stato chiamato il metodo è la stessa istanza di quello fornito nella chiamata a Verify.

È impossibile per loro essere la stessa istanza, perché in Verifyte crei un file new ImageFilterOptions().

Invece di eseguire il controllo dei parametri in questo modo, è possibile utilizzare la It.Issintassi di Moq per fornire un'espressione che verifica che il parametro sia quello previsto.

Nel tuo caso, vuoi controllare che il parametro sia di tipo ImageFilterOptionse che sia il Widthche il Heightsiano impostati su 256. L'espressione che ti permette di farlo è:

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

Quindi, la tua chiamata a Verifypotrebbe assomigliare a questo:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));

1
La sintassi che ho dovuto uso sarebbe: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). Non c'era nessun genericoIs
Stanislav

1
La versione generica funziona per me ed è nei documenti API nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - stai usando una versione obsoleta di Moq?
Tim Abell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.