public static Moq.Mock <TRepo> SetupRepository <TKey, TModel, TRepo>(List <TModel> lModels) where TModel : class, IIdentityKey <TKey> where TRepo : class, IRepository <TKey, TModel> where TKey : struct, IComparable, IComparable <TKey>, IConvertible, IEquatable <TKey>, IFormattable { IQueryable <TModel> queryableList = lModels.AsQueryable(); var mockSet = new Moq.Mock <IDbSet <TModel> >(); mockSet.As <IQueryable <TModel> >().Setup(m => m.Provider).Returns(queryableList.Provider); mockSet.As <IQueryable <TModel> >().Setup(m => m.Expression).Returns(queryableList.Expression); mockSet.As <IQueryable <TModel> >().Setup(m => m.ElementType).Returns(queryableList.ElementType); mockSet.As <IQueryable <TModel> >().Setup(m => m.GetEnumerator()).Returns(queryableList.GetEnumerator()); Moq.Mock <TRepo> repository = new Moq.Mock <TRepo>(); repository.Setup(x => x.Entities).Returns(mockSet.Object); repository.Setup(x => x.GetById(Moq.It.IsAny <TKey>())).Returns((int i) => lModels.Find(x => x.Id.Equals(i))); repository.Setup(x => x.Insert(Moq.It.IsAny <TModel>())).Callback <TModel>(y => { var item = lModels.OrderByDescending(x => x.Id).FirstOrDefault(); if (item != null) { dynamic z = item.Id; y.Id = z + 1; lModels.Add(y); } }); repository.Setup(x => x.Update(Moq.It.IsAny <TModel>())).Callback <TModel>(y => { var i = lModels.FindIndex(x => x.Id.Equals(y.Id)); if (i != -1) { lModels[i] = y; } }); repository.Setup(x => x.Delete(Moq.It.IsAny <TModel>())).Callback <TModel>(y => { var item = lModels.Where(x => x.Id.Equals(y.Id)).FirstOrDefault(); if (item != null) { lModels.Remove(item); } }); repository.Setup(x => x.GetByIdAsync(Moq.It.IsAny <TKey>())).Returns((TKey i) => { return(Task.FromResult(lModels.Find(x => x.Id.Equals(i)))); }); repository.Setup(x => x.InsertAsync(Moq.It.IsAny <TModel>())).Returns((TModel y) => Task.Run(() => { var item = lModels.OrderByDescending(x => x.Id).FirstOrDefault(); if (item != null) { dynamic z = item.Id; y.Id = z + 1; lModels.Add(y); } }) ); repository.Setup(x => x.UpdateAsync(Moq.It.IsAny <TModel>())).Returns((TModel y) => Task.Run(() => { var i = lModels.FindIndex(x => x.Id.Equals(y.Id)); if (i != -1) { lModels[i] = y; } }) ); repository.Setup(x => x.DeleteAsync(Moq.It.IsAny <TModel>())).Returns((TModel y) => Task.Run(() => { var item = lModels.Where(x => x.Id.Equals(y.Id)).FirstOrDefault(); if (item != null) { lModels.Remove(item); } }) ); return(repository); }