1

リポジトリに moq を使用するために私が見た例は、返されるものをモックする方法を示しているだけです。少し奇妙な要件があります。クエリが実行されたときに、条件が存在する場合、特定のアイテムをリポジトリに追加する必要があります。データベースにクエリを実行せずにこれをテストする方法を知りたいです。既存の条件をモックする方法は知っていますが、特定のアイテムが追加されたことをテストできるように、モックをどのようにセットアップしますか?

4

5 に答える 5

1

moq の代わりにメモリ リポジトリ内の偽物を使用してみてください。たとえば、すべてのエンティティのユニバーサル ジェネリック リポジトリです。

public interface IInMemoryRepository<T> where T : class
{
    IQueryable<T> GetAll();
    void Create(T item);
    void Update(T item);
    T GetItem(Expression<Func<T, bool>> expression);
    void Delete(T item);
}

public class InMemoryRepository<T> : IInMemoryRepository<T> where T : class
{
    private int _incrementer = 0;
    public Dictionary<int, T> List = new Dictionary<int, T>();

    public IQueryable<T> GetAll()
    {
        return List.Select(x => x.Value).AsQueryable();
    }

    public void Create(T item)
    {
        _incrementer++;
        item.GetType().GetProperties().First(p => p.Name == "Id").SetValue(item, _incrementer, null);
        List.Add(_incrementer, item);
    }

    public void Update(T item)
    {
        var key = (int)item.GetType().GetProperties().First(p => p.Name == "Id").GetValue(item, null);
        List[key] = item;
    }

    public T GetItem(Expression<Func<T, bool>> expression)
    {
        return List.Select(x => x.Value).SingleOrDefault(expression.Compile());
    }

    public void Delete(T item)
    {
        var key = (int)item.GetType().GetProperties().First(p => p.Name == "Id").GetValue(item, null);
        List.Remove(key);
    }
}
于 2012-10-25T16:58:22.190 に答える
1

このブログ記事は役に立つかもしれませんが、投稿を書いてからデザインが多少変更されたため、更新する必要があります。DbContext をモックできるように、一般的なリポジトリ パターンを使用しました。これにより、データアクセスレイヤーを「端まで」テストできます。 汎用リポジトリと作業単位

于 2012-10-26T13:45:16.100 に答える
1

リポジトリをモックしないでください。データベースの代わりにメモリ内ストアを使用する代替リポジトリがあり、IoC を使用してテスト/コードの正しいリポジトリ実装を選択します。

于 2012-10-25T16:22:03.427 に答える