2013-01-13 26 views
3

我有以下的方法在我的倉庫如何模擬包含DbSet的方法?

public IQueryable<T> QueryWithInclude(String include) 
     { 
      return _dbSet.Include(include); 
     } 

我怎麼能嘲笑我使用起訂量這樣的方法。我似乎無法找出正確的方法。

例如,我可以做

public IQueryable<T> Query() 
      { 
       return _dbSet; 
      } 

mockrepository.Setup(_ => _.Query()).Returns(foo.AsQueryable()); 

而且下面,如果這種方法的嘲笑/ s的最終證明是困難的則是明智的考慮替代實現/解決方法?

回答

2

只要您的抽象返回IQueryable(如DbSet),那麼你可以創建自己的Include擴展到IQueryable。您的代碼將自動調用您的新的Include擴展方法。當用於返回DbQuery的抽象時,它將調用正確的Invoke,否則如果它是IQueryable實例,則它將不執行任何操作。添加這個新的擴展方法意味着你的當前代碼應該編譯沒有任何改變。

像這樣:

/// see: http://msdn.microsoft.com/en-us/library/ff714955.aspx 
    ///  
    /// The method has been modified from version that appears in the referenced article to support DbContext in EF 4.1 -> 
    /// 
    /// </summary> 
    public static class ModelExtensions { 
     public static IQueryable<T> Include<T> 
       (this IQueryable<T> sequence, string path) where T : class { 
      var dbQuery = sequence as DbQuery<T>; 
      if (dbQuery != null) { 
       return dbQuery.Include(path); 
      } 
      return sequence; 
     } 
    } 

所以,如果你的單元測試使用假IQueryable名單中,包括不會做任何事情。

我必須補充一點,雖然有強烈的意見,爲什麼它是不好的和無用的嘲笑EntityFramework。如果你沒有看到它們,可能值得檢查它們。

+0

如果我使用你的方法,那麼我的單元測試將需要對EF的引用。我有單獨的集成測試來測試EF的東西。想法? –

+0

在您當前的設計中,如何避免在測試存儲庫層時引用EF程序集? –

+0

當我測試存儲庫時,對EF的引用是存在的,但在我測試服務層時沒有。對於服務層,我不應該嘲笑我的存儲庫?或者我弄明白了嗎? –

相關問題