Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Data.Entity.Infrastructure;
  5. using System.Linq;
  6. using System.Linq.Expressions;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using Moq;
  10.  
  11. namespace Tests
  12. {
  13. internal static class DbSetMock
  14. {
  15. private class AsyncEnumerator<T> : IDbAsyncEnumerator<T>
  16. {
  17. private readonly IEnumerator<T> _inner;
  18. public AsyncEnumerator(IEnumerator<T> inner)
  19. {
  20. _inner = inner;
  21. }
  22. public void Dispose() => _inner.Dispose();
  23. public Task<bool> MoveNextAsync(CancellationToken cancellationToken) => Task.FromResult(_inner.MoveNext());
  24. public T Current => _inner.Current;
  25. object IDbAsyncEnumerator.Current => Current;
  26. }
  27.  
  28. class AsyncEnumerable<T> : EnumerableQuery<T>, IDbAsyncEnumerable<T>, IQueryable<T>
  29. {
  30. public AsyncEnumerable(Expression expression) : base(expression) { }
  31. public IDbAsyncEnumerator<T> GetAsyncEnumerator() => new AsyncEnumerator<T>(this.AsEnumerable().GetEnumerator());
  32. IDbAsyncEnumerator IDbAsyncEnumerable.GetAsyncEnumerator() => GetAsyncEnumerator();
  33. IQueryProvider IQueryable.Provider => new AsyncQueryProvider<T>(this);
  34. }
  35.  
  36. class AsyncQueryProvider<TEntity> : IDbAsyncQueryProvider
  37. {
  38. private readonly IQueryProvider _inner;
  39.  
  40. internal AsyncQueryProvider(IQueryProvider inner)
  41. {
  42. _inner = inner;
  43. }
  44.  
  45. public IQueryable CreateQuery(Expression expression) => new AsyncEnumerable<TEntity>(expression);
  46. public IQueryable<TElement> CreateQuery<TElement>(Expression expression) => new AsyncEnumerable<TElement>(expression);
  47. public object Execute(Expression expression) => _inner.Execute(expression);
  48. public TResult Execute<TResult>(Expression expression) => _inner.Execute<TResult>(expression);
  49. public Task<object> ExecuteAsync(Expression expression, CancellationToken cancellationToken) => Task.FromResult(Execute(expression));
  50. public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken) => Task.FromResult(Execute<TResult>(expression));
  51. }
  52.  
  53. public static Mock<DbSet<T>> GetMockDbSet<T>(List<T> sourceList, Func<object[], T> findPredicateFunc) where T : class
  54. {
  55. var mockDbSet = new Mock<DbSet<T>>();
  56. var listQueryable = sourceList.AsQueryable();
  57. //mockDbSet.As<IQueryable<T>>().Setup(s => s.Provider).Returns(listQueryable.Provider);
  58. mockDbSet.As<IQueryable<T>>().Setup(s => s.Expression).Returns(listQueryable.Expression);
  59. mockDbSet.As<IQueryable<T>>().Setup(s => s.ElementType).Returns(listQueryable.ElementType);
  60. mockDbSet.As<IQueryable<T>>().Setup(s => s.GetEnumerator()).Returns(listQueryable.GetEnumerator());
  61. mockDbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>(sourceList.Add).Returns((T t) => t);
  62. mockDbSet.Setup(d => d.Remove(It.IsAny<T>())).Callback<T>(s => sourceList.Remove(s));
  63. mockDbSet.Setup(d => d.RemoveRange(It.IsAny<IEnumerable<T>>())).Callback<IEnumerable<T>>(s =>
  64. {
  65. foreach (var i in s.ToList()) sourceList.Remove(i);
  66. });
  67. mockDbSet.As<IQueryable<T>>()
  68. .Setup(m => m.Provider)
  69. .Returns(new AsyncQueryProvider<T>(listQueryable.Provider));
  70. mockDbSet.As<IDbAsyncEnumerable<T>>()
  71. .Setup(m => m.GetAsyncEnumerator())
  72. .Returns(new AsyncEnumerator<T>(listQueryable.GetEnumerator()));
  73. mockDbSet.Setup(m => m.Find(It.IsAny<object[]>())).Returns(findPredicateFunc);
  74. mockDbSet.Setup(m => m.FindAsync(It.IsAny<object[]>())).Returns<object[]>(ids => Task.FromResult(findPredicateFunc(ids)));
  75. return mockDbSet;
  76. }
  77.  
  78. }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement