2012-11-21 124 views
42

我想驗證一個參數是一個類。正在測試的代碼很好。該錯誤在測試中。Moq驗證對象參數

我試過兩種方法,都失敗了。

這裏是我的嘗試:

1:

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

這總是失敗,即使作爲第二個參數傳遞的對象具有等於屬性。第一個參數驗證很好。

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

這總是通過,即使它應該失敗。回調中的斷言失敗,但異常不會傳遞到外部上下文,因此測試總是通過。

你能幫我找到我做錯了什麼嗎?

回答

66

第一次嘗試更接近你想要達到的目標。

失敗的原因是,起訂量(可能)使用Object.Equals的掩護下,以測試是否ImageFilterOptions參數,該方法被調用的是同一個實例,你在調用提供給Verify之一。

它們不可能是同一個實例,因爲在Verify中創建了一個new ImageFilterOptions()

您可以使用Moq的It.Is語法來提供驗證參數是否爲預期參數的表達式,而不是使用此方法執行參數檢查。

對於您的情況,您需要檢查參數的類型爲ImageFilterOptions,並且WidthHeight都設置爲256。這可以讓你做到這一點的表達是:

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

,那麼你對Verify調用看起來是這樣的:

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

點上,謝謝! – rhughes

+1

我不得不使用的語法是:It.Is((ImageFilterOptions p)=> p.Width == 256 && p.Height == 256)''。沒有通用的'Is' – Nemo1024

+0

通用版本適用於我,並且在API文檔中http://www.nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - 您是否使用過時版本的Moq? –