2013-12-19 43 views
1

我有以下的一段,我試圖模擬出使用起訂量,具體代碼_userRepository.Find():起訂量設定不返回預期的目的,不匹配的調用

List<string> importEmails = ocrImportCentres.Select(c => c.CentreAdministratorEmail).Where(e => !string.IsNullOrWhiteSpace(e)).ToList(); 

var existingUsersWithEmail = 
      _userRepository.Find(
       x => 
        importEmails.Contains(
         x.PersonalDetailsHistory.OrderByDescending(h => h.DateCreated).FirstOrDefault().Email)) 
       .Select(o => new 
       { 
        o.PersonalDetailsHistory.FirstOrDefault().Email, 
        (o as OCRInstitutionAdmin).UniqueId 
       }); 

的查找()方法內IRepository定義:

IQueryable<T> Find(Expression<Func<T, bool>> predicate); 
IQueryable<T> Find(Expression<Func<T, bool>> predicate = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = ""); 
我的單元測試內

Moq的設置:

_userRepository.Setup(
      x => 
       x.Find(It.IsAny<Expression<Func<User, bool>>>(), 
        It.IsAny<Func<IQueryable<User>, IOrderedQueryable<User>>>(), It.IsAny<string>())) 
      .Returns(existingAdmins.AsQueryable); 

然而單位時測試運行_userRepository.Find()在查看_userRepository.Verify()後不會返回預期的測試對象。我可以看到我的設置與執行調用不匹配,因此我沒有返回預期的對象。

演出調用:

IRepository`1. Find(x => value(OCRExamCreator.BusinessLogic.Services.OCRImportCentreManagementService+<>c__DisplayClasse).importEmails.Contains(x.PersonalDetailsHistory.OrderByDescending(h => h.DateCreated).FirstOrDefault().Email)) 

我確實有單元測試的傳球和起訂量_userRepository.Setup工作,直到我不得不改變_userRepository.Find()LINQ,以防止出現以下異常:

{"Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries."} 

我試過改變_userRepository.Setup(),但是我不能得到它返回我需要的測試數據,任何幫助/指針將不勝感激

+1

它在我看來,就像你在Setup()中定義的那樣,期望Find()有4個參數被調用,但是Verify()告訴你它是用一個參數調用的,但是對Find()的調用非常多毛,我可能會讀錯。 –

+0

我曾嘗試使用.Find()設置Setup(),並使用單個參數(例如,嘲笑IQueryable Find(Expression > predicate);然而這導致了一個參數計數不匹配異常,這導致我使用Find()的其他實現。感謝您的期待。 – Rocy

+0

正如ledbutter指出,查找方法被稱爲一個單一的參數。我真的不明白爲什麼這樣解決了這個問題,但我改變了我的設置,以便在Find方法中使用單個參數,但也重載了Return方法,就像這樣... _ userRepository.Setup( x => x.Find(It .IsAny >>())) .Returns((Expression > predicate)=> existingAdmins.AsQueryable());這個鏈接幫助我出局 http://stackoverflow.com/questions/5196669/moqing-methods-where-expressionfunct-bool-are-passed-in-as-parameters – Rocy

回答