2011-09-19 46 views
5

我使用.net 4與C#,EntityFramework 4和Moq 4.我試圖嘲笑我的UnitOfWork,一個倉庫,最後一個方法調用。使用Unitofwork的倉庫嘲笑Lambda

這裏是

 var unitOfWorkMock = new Mock<UnitOfWork>(); 
     var cFieldRepositoryMock = new Mock<IRepository<CField>>(); 

     System.Linq.Expressions.Expression<Func<CField, bool>> query = (x) => x.CID == c && x.FID == parentFID; 

     cFieldRepositoryMock.Setup(x => x.GetFirst(query)); 

方法簽名爲GetFirst我有麻煩的代碼:

  T GetFirst(Expression<Func<T, bool>> query = null, 
     Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null); 

CField:

public class CField 
{ 
    public CField() 
    { 
     //do stuff 
    } 
    public int ID { get; set; } 
    public int FID { get; set; } 
    public int CID { get; set; } 
} 

我期待發生的事情: 我我期待,當我打電話給我的cFieldRepositoryMock的GetFirst方法,它會matc h我傳入的lambda表達式與我在Setup中定義的表達式相反。

發生的事情: 我的設置分配得到一個編譯器錯誤:「表達式樹不能包含使用可選參數的調用或調用」

我清楚地做錯了什麼,我只是不知道是什麼。任何建議表示讚賞,我對單元測試相當陌生。

謝謝! AFrieze

+0

你能發佈CField的聲明和getfirst()的方法簽名? – David

+0

嗨大衛,我添加了所需的信息。我無法發佈整個CField類,因此我發佈了具有正確類型和可訪問性級別的相關字段。 – AFrieze

+2

你有沒有爲orderBy-Argument添加一個參數(有It.IsAny <...>或null)?我不完全知道,但我認爲Moq本身使用表達式,我認爲你必須在這裏提供* all *參數。 – Carsten

回答

8

您收到的eror似乎是實際上是一個limitation of expressions

爲單元測試這樣的東西考慮使用It.IsAny(如卡斯滕已經建議):

cFieldRepositoryMock.Setup(x => x.GetFirst(query, It.IsAny<Func<IQueryable<CField>, IOrderedQueryable<CField>>>()));