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(),但是我不能得到它返回我需要的測試數據,任何幫助/指針將不勝感激
它在我看來,就像你在Setup()中定義的那樣,期望Find()有4個參數被調用,但是Verify()告訴你它是用一個參數調用的,但是對Find()的調用非常多毛,我可能會讀錯。 –
我曾嘗試使用.Find()設置Setup(),並使用單個參數(例如,嘲笑IQueryable Find(Expression > predicate);然而這導致了一個參數計數不匹配異常,這導致我使用Find()的其他實現。感謝您的期待。 –
Rocy
正如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