2012-11-21 1 views
42

Sto provando a verificare un parametro che è una classe. Il codice in fase di test va bene. Il bug è nel test.Verifica Moq con parametro oggetto

Ho provato due metodi, entrambi hanno fallito.

Qui sono i miei tentativi:

1:

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

questo non riesce sempre, anche se un oggetto passato come secondo parametro ha uguali proprietà. 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 dovesse fallire. Gli Assert in the callback falliscono, ma l'eccezione non viene passata al contesto esterno e quindi il test passa sempre.

Potete aiutarmi a trovare quello che sto facendo male?

risposta

66

Il primo tentativo è più vicino a ciò che si desidera raggiungere.

La ragione non riesce è che Moq (probabilmente) utilizza Object.Equals sotto il coperchio per verificare se il parametro ImageFilterOptions che il metodo è stato chiamato con la stessa istanza come quello da Lei forniti nella chiamata a Verify.

È impossibile per loro essere la stessa istanza, perché in Verify si crea un new ImageFilterOptions().

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

Nel tuo caso, si vuole verificare che il parametro è di tipo ImageFilterOptions e che sia la Width e Height sono impostati su 256. L'espressione che permette di fare che è:

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

Quindi, la chiamata a Verify potrebbe essere la seguente:

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

Spot, grazie! – rhughes

+1

La sintassi che dovevo usare sarebbe: 'It.Is ((ImageFilterOptions p) => p.Width == 256 && p.Height == 256)'. Non c'era un generico 'Is' – Nemo1024

+0

La versione generica funziona per me e si trova nei documenti API http://www.nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - sei tu usando una versione obsoleta di Moq? –