2013-04-02 113 views
2

我正在學習如何編寫單元測試,並且有點卡在使用Mocks。我使用Moq來嘲笑。我正在使用VS 2012自帶的內置測試框架。如果更好(我可以解決我的問題),我可以切換到NUnit。我有一個工作模式設置單元。我正在測試的方法是重置用戶的密碼。我告訴起訂量返回基於一個唯一代碼的用戶的列表,它就是所謂的方法我測試:嘲笑對象列表

var mock = new Mock<IUnitOfWork>(); 
     mock.Setup(u => u.UserRepository.Get(t => t.PassResetCode.Equals("test1"), null, "")).Returns(
      new List<User> 
     { 
      new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "[email protected]", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },     
     }); 

在我測試它的方法調用如下:

var users = unitOfWork.UserRepository.Get(u => u.PassResetCode.Equals(code)); 

據我所知,它並沒有返回我在測試中創建的用戶列表。我是否也需要模擬工作單元課程中的存儲庫?或者只是嘲笑工作單元界面足夠了?如果有幫助,我可以發佈更多的代碼。

回答

1

您的存儲庫接受委託,並且您正在設置期望特定委託t => t.PassResetCode.Equals("test1")。我認爲模擬內部將比較傳遞給這個代表的謂詞。不同的委託實例不符合99.99%的概率。您應該避免在此特定期望中爲謂詞設置特定的約束,並使用It.IsAny<>()代替。

var mock = new Mock<IUnitOfWork>(); 
mock.Setup(It.IsAny<Func<User, bool>>(), null, ""), ...).Returns(...) 
+0

在這種情況下,我仍然不太確定如何使用'It.IsAny <>()'。輸入你擁有它似乎並沒有編譯。你可以添加更多的例子,或者你需要更多的代碼來做到這一點?我感謝幫助! – ssn771

+0

@ ssn771,對不起,有一個答案。在'It.IsAny 'T應該是你傳遞給'Get'方法的委託類型。 – Snowbear

+0

它似乎仍然抱怨。這是錯誤信息:'參數1:無法從'System.Func '轉換爲'System.Linq.Expressions.Expression >'方法簽名GET方法是:'公共虛擬IEnumerable的獲取( 表達>濾波器= NULL, Func鍵,IOrderedQueryable > ORDERBY = NULL, 串includeProperties = 「」)' – ssn771

0
var mock = new Mock<IUnitOfWork>(); 
     mock.Setup(u => u.UserRepository.Get("test1", null, "")).Returns(
      new List<User> 
     { 
      new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "[email protected]", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },     
     }); 

您必須確保您正在傳遞這些參數。或者你可以使用語法It.IsAny<TYPE>()來處理你不關心的任何參數。或者您可以執行It.Is<TYPE>(condition)來檢查參數。

0

假設您使用Moq,問題是安裝方法不處理類似的lambda。您需要使用It.IsAny<Func<T, bool>>()作爲第一個參數。