簡體   English   中英

如何模擬包含DbSet的方法?

[英]How to mock Include method of DbSet?

我的存儲庫中有以下方法

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

我怎么能模仿我使用Moq這樣的方法。 我似乎無法找到正確的方法。

例如,我可以做以下事情

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

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

而且,如果這種方法的模擬最終變得困難,那么考慮替代實現/解決方法是明智的嗎?

只要你的抽象返回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列表,則Include將不執行任何操作。

我必須補充說,對於為什么它很糟糕而且毫無價值來嘲笑EntityFramework有強烈的意見。 如果您還沒有看到它們,那么檢查它們可能是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM