2013-02-18 48 views
1

單元測試我的asp.net MVC web應用程序,我想嘲笑我的IGenericRepository(我使用Moq)。嘲笑一個通用的存儲庫方法

必須被嘲笑看起來像這樣的方法:

useraccountRepository = new Mock<IGenericRepository<Useraccount>>(); 

現在我想告訴起訂量,當:

IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = ""); 

我已經嘲笑庫沒有任何問題我的界面的Get方法被調用,應該返回一個使用清單列表:

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email && u.Password == useraccount.Password)).Returns(useraccounts); 

I thi nk在我的第二個lambda中有一個錯誤,因爲這個工作原理如下:

useraccountRepository.Setup(r => r.Get(null, null, "")).Returns(useraccounts); 

但是我的錯誤在哪?

什麼也可以工作:

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email 
      && u.Password == useraccount.Password, null, "")).Returns(useraccounts); 

它看起來像默認參數值在我假裝不適用。這是爲什麼?

如果我使用

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email 
      && u.Password == useraccount.Password, null, "")).Returns(useraccounts); 

無論如何,然後在我的控制器方法拋出時,Get消息被稱爲異常:

private bool validateUser(Useraccount useraccount) 
    { 
     try 
     { 
      Useraccount useraccountLogin = UnitOfWork.UseraccountRepository.Get(
       u => u.Email == useraccount.Email && u.Password == useraccount.Password).Single<Useraccount>(); 

      return (useraccountLogin != null); 
     } 
     catch (Exception exc) 
     { 
      return false; 
     }    
    } 

哪裏是我的錯誤呢?

預先感謝您。 Michael

+0

**什麼**不起作用,哪些**異常被拋出?你像一個專業人士一樣瀏覽具體細節... – 2013-02-18 17:58:40

+0

對不起,讓你感到困惑。 如果我的單元測試的ValidateUser(...)內 - 方法被調用(從一個控制器的方法的內部)拋出異常,其中UseraccountRepository.Get(...)被調用: [System.InvalidOperationException] = {」序列不包含元素「}。 「at System.Linq.Enumerable.Single [TSource](IEnumerable'1 source)\ r \ n at ...」。 – mosquito87 2013-02-18 19:39:42

回答

0

根據此問題Moq.Mock<T> - how to setup a method that takes an expression,Moq不支持對錶達式參數的設置約束。

+0

我發現並至少可以工作的是: useraccountRepository.Setup(r => r.Get(It.IsAny >>(),null,「」))。 (useraccounts); 有沒有更好的方法,或者已經是嘲笑我已經顯示的存儲庫方法的最佳方式? – mosquito87 2013-02-18 19:54:50

+0

我認爲這是你最好的選擇。但是,當你需要用不同的表達式來模擬兩個不同的調用時,顯然你會遇到問題。我會考慮廢除通用回購。許多專家認爲這是一種反模式,部分原因是可測試性差。 – 2013-02-18 20:34:29

+0

謝謝你的幫助。 你的鏈接把我帶到了正確的軌道。 :) – mosquito87 2013-02-19 07:14:54