5

リポジトリに次のメソッドがあります

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

Moq を使用しているようなメソッドをモックするにはどうすればよいですか。正しい方法を見つけることができないようです。

たとえば、次のことができます

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

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

また、そのようなメソッドのモック化が最終的に困難であることが判明した場合は、代替の実装/回避策を検討するのが賢明ですか?

4

1 に答える 1

3

IQueryable抽象化が( のように)返される限り、への独自の拡張機能をDbSet作成できます。コードは、新しい Include 拡張メソッドを自動的に呼び出します。を返す抽象化で使用すると、正しい Invoke が呼び出されます。それ以外の場合は、何もしません。この新しい拡張メソッドを追加することは、現在のコードを変更せずにコンパイルする必要があることを意味します。IncludeIQueryableDbQueryIQueryable

そのような:

    /// 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 を模倣することが悪いことであり、価値がないのかについては、強い意見があることを付け加えなければなりません。まだ見ていない場合は、チェックしてみる価値があるかもしれません。

于 2013-01-13T09:29:03.147 に答える