あなたのリポジトリを偽造しないでください。代わりにIRepository
を実装するDummyRepository
を作成します。あなたはこの
public interface IRepository
{
void Add<T>(T entity) where T : class;
T Get<T>(int id, params Expression<Func<T, object>>[] includes) where T : BaseEntity;
IQueryable<T> GetAll<T>(params Expression<Func<T, object>>[] includes) where T : class;
void Remove<T>(T entity) where T : class;
void SaveChanges();
}
ようIRepository
strucutureを持っている場合は、あなたのDummyRepositoryは、あなたがこの
public class BaseEntity
{
public int Id { get; set; }
}
のようである動作するように、この例のためBaseEntityを必要とするような方法でこの
public class DummyRepository : IRepository
{
private readonly Dictionary<Type, Object> _database;
public DummyRepository()
{
_database = new Dictionary<Type, object>();
}
public void Add<T>(T entity) where T : class
{
var table = GetEntityTable<T>();
var entityBase = entity as BaseEntity;
if (entityBase == null)
throw new NotImplementedException("You must inherit from entity base");
if (entityBase.Id == 0)
{
var idToUse = table.Any() ? table.Max(x => (x as BaseEntity).Id) + 1 : 1;
typeof(BaseEntity).GetProperty("Id").SetValue(entityBase, idToUse);
table.Add(entity);
}
else
{
var itemInList = table.FirstOrDefault(x => (x as BaseEntity).Id == entityBase.Id);
if (itemInList == null)
table.Add(entity);
else
{
var itemIndex = table.IndexOf(itemInList);
table[ itemIndex ] = entity;
}
}
}
private List<T> GetEntityTable<T>() where T : class
{
List<T> table;
if (_database.ContainsKey(typeof(T)))
table = (List<T>)_database[ typeof(T) ];
else
{
table = new List<T>();
_database.Add(typeof(T), table);
}
return table;
}
public T Get<T>(int id, params Expression<Func<T, object>>[] includes) where T : BaseEntity
{
if (!_database.ContainsKey(typeof(T)))
return null;
return ((List<T>)_database[ typeof(T) ]).FirstOrDefault(x => x.Id == id);
}
public IQueryable<T> GetAll<T>(params Expression<Func<T, object>>[] includes) where T : class
{
if (_database.ContainsKey(typeof(T)))
return ((List<T>)_database[ typeof(T) ]).AsQueryable();
return new List<T>().AsQueryable();
}
public void Remove<T>(T entity) where T : class
{
if (_database.ContainsKey(entity.GetType()))
((IList)_database[ entity.GetType() ]).Remove(entity);
}
public void SaveChanges() { }
}
を行う必要があります
テスト開始時にはAdd
のデータが必要です。クエリを確認できるテストを書くことができれば幸いです。
あなたがサービスクラスを持っていないので、以下のコードは歓迎されませんが、私はここであなたの使い方の例を挙げてjusyです。
IRepository repository = new DummyRepository();
repository.Add(new BaseEntity { Id = 1 });
var service = new Service(repository);
これで実際にどのクラスをテストしていますか?あなたはモックを試しているように見えます。 –
私は実際にそれを取得しません。私はデータベース内の項目を数えなければならない。しかし、私はDBに接続する必要はないので。私はそれを嘲笑しなければならない。実際のコードでは、おそらく私はそれを設定しているLINQクエリの種類を使用します。 – user1960948
カウントコードは自分で書くものなのですか?あなた自身のコードだけをテストしなければなりません。 –