2011-02-12 131 views
4

我正在玩.NET MVC,我正在編寫一些單元測試。我有一個接口庫,看起來像這樣:如何使用Moq來模擬存儲庫Single(Expression <Func <TEntity,bool >> predicate)方法

public interface IRepository<TEntity> : IDisposable where TEntity : class 
{ 
    IQueryable<TEntity> GetAll(); 
    TEntity Single(Expression<Func<TEntity, bool>> predicate); 
} 

我都嘲笑GETALL方法是這樣的:

_mockRepository.Setup(x => x.GetAll()).Returns(
      new List<Post> 
       { 
        new Post { Title = "Test Post 1" }, 
        new Post { Title = "Test Post 2" } 
       }.AsQueryable()); 

現在,我不知道我怎麼會嘲笑單一的方法,因爲它有一個包含我想要評估的表達式的參數。

感謝,

B3N

編輯:

我改變了代碼:

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>())) 
     .Returns((Expression<Func<Post, bool>> expr) => new List<Post> { 
     new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now }, 
     new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now }  
     }.Where(expr)); 

但我現在收到以下錯誤:

「System.Collections中.Generic.List'不包含'Where'和最佳擴展名m的定義ethod重載'System.Linq.Queryable.Where(System.Linq.IQueryable,System.Linq.Expressions.Expression>)'有一些無效的參數。

這是甚至是最好的方法來做到這一點,或者應該單一的方法只返回一個新的職位,甚至沒有考慮傳遞的表達式?

編輯2:

這是工作結果。

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>())).Returns(
      (Expression<Func<Post, bool>> expr) => 
      new List<Post> 
       { 
        new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now }, 
        new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now } 
       }.Single(expr.Compile())); 
+0

偉大的問題...指出我在正確的方向。 – IbrarMumtaz 2012-05-28 09:40:30

回答

4

我相信,如果你需要使用的參數,你可以使用參數匹配,以及在該方法返回一個lambda:

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<TEntity, bool>>>()) 
       .Returns((Expression<Func<TEntity, bool>> expr) => ...); 

編輯: 你現在得到的錯誤是因爲您正在嘗試將表達式樹傳遞給LINQ-To-Objects的Where方法。要解決此問題,請使用以下代碼:

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>())) 
    .Returns((Expression<Func<Post, bool>> expr) => new List<Post> { 
    new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now }, 
    new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now }  
    }.Where(expr.Compile())); 

Compile()會將表達式樹轉換爲簡單的Func委託。另外,由於模擬方法返回單個對象,因此Where()也不起作用。

+0

這樣做是否有意義:_mockRepository.Setup(x => x.Single(It.IsAny >>)。Returns(new Post {...}); – b3n 2011-02-12 06:36:13

相關問題