2012-04-17 129 views
1

我有一個私人方法正在被調用的方法,我正在testing.I想驗證正確的參數正在傳遞給這個私人方法。我已經在Moq中編寫了以下設置,它將測試我想要的內容,但它並不真正允許我遵循Arrange,Act,Assert模式。有沒有更好的方法用Moq編寫這個測試?

有沒有什麼方法可以執行類似的測試,其中assert可以出現在我的所有其他斷言中?目前下面的代碼存在於編配中。

 myClass.Setup(
       x => 
       x.myMethod(
        It.IsAny<Person>>(), 
        It.IsAny<string>(), 
        It.IsAny<Person>(), 
        It.IsAny<ICollection<string>>(), 
        It.IsAny<ICollection<string>>(), 
        It.IsAny<bool>())).Callback 
       <Person, string, Person, Person, ICollection<string>, bool>(
        (a, b, c, d, e, f) => 
         { 
          Assert.AreEqual("NameA", a.Name); 
          Assert.AreEqual("StringB", b); 
          Assert.AreEqual("NameC", c.Name); 
          Assert.AreEqual(2, d); 

          var dList = d.ToList().OrderBy(x => x.Name); 
          Assert.AreEqual("PersonA", dList[0].Name) 
          Assert.AreEqual("PersonB", dList[1].Name); 
         }); 

我應該說,我知道,你可以perfom校驗來檢查方法是否調用了一定的投入,但我不知道的匹配ICollection的則params的任何方式。

回答

3

如果您正在使用這些斷言來檢查參數,您可以在您的設置中執行此操作。如果你的模擬使用嚴格的行爲,如果參數與謂詞不匹配,它將失敗。

// declare your mock with strict behavior 

myClass.Setup(
    x => 
    x.myMethod(
     It.Is<Person>(person => person.Name == "NameA"), 
     "Stringb", 
     It.Is<Person>(person => person.Name == "NameC"),, 
     It.Is<ICollection<string>>(coll =>{ 
       //your other validations 
      }), 
     It.IsAny<ICollection<string>>(), 
     It.IsAny<bool>())); 
2

單元測試的目的是驗證你的類的行爲如預期。你應該通過公共接口健美班,並檢查以下幾件事:

  • 類狀態改變
  • 返回的結果
  • 調用依賴

其他的東西沒有價值,而類的行爲預期。您可以重構您的課堂,並使該內部方法聯機。

+0

嗨,感謝您的評論。你是對的,我不應該測試私人方法。編寫示例時我犯了一個錯誤,它實際上是我試圖測試的一個依賴。 Ufuk給出的答案在這種情況下有所幫助。 – user460667 2012-04-17 14:22:39

+0

@ user460667沒問題,只是建議別人不要測試什麼不應該測試:) – 2012-04-17 14:31:43

相關問題