-
-
Notifications
You must be signed in to change notification settings - Fork 72
/
MoqExtensions.cs
72 lines (61 loc) · 2.51 KB
/
MoqExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MockQueryable.EntityFrameworkCore;
using Moq;
namespace MockQueryable.Moq
{
public static class MoqExtensions
{
public static IQueryable<TEntity> BuildMock<TEntity>(this IEnumerable<TEntity> data) where TEntity : class
{
return new TestAsyncEnumerableEfCore<TEntity>(data);
}
public static Mock<DbSet<TEntity>> BuildMockDbSet<TEntity>(this IEnumerable<TEntity> data) where TEntity : class => data.BuildMock().BuildMockDbSet();
public static Mock<DbSet<TEntity>> BuildMockDbSet<TEntity>(this IQueryable<TEntity> data) where TEntity : class
{
var mock = new Mock<DbSet<TEntity>>();
var enumerable = new TestAsyncEnumerableEfCore<TEntity>(data);
mock.ConfigureAsyncEnumerableCalls(enumerable);
mock.As<IQueryable<TEntity>>().ConfigureQueryableCalls(enumerable, data);
mock.As<IAsyncEnumerable<TEntity>>().Setup(x => x.GetAsyncEnumerator(It.IsAny<CancellationToken>())).Returns(() => enumerable.GetAsyncEnumerator());
mock.Setup(m => m.AsQueryable()).Returns(enumerable);
mock.ConfigureDbSetCalls(data);
return mock;
}
private static void ConfigureDbSetCalls<TEntity>(this Mock<DbSet<TEntity>> mock, IQueryable<TEntity> data)
where TEntity : class
{
mock.Setup(m => m.AsQueryable()).Returns(mock.Object);
mock.Setup(m => m.AsAsyncEnumerable()).Returns(CreateAsyncMock(data));
}
private static void ConfigureQueryableCalls<TEntity>(
this Mock<IQueryable<TEntity>> mock,
IQueryProvider queryProvider,
IQueryable<TEntity> data) where TEntity : class
{
mock.Setup(m => m.Provider).Returns(queryProvider);
mock.Setup(m => m.Expression).Returns(data?.Expression);
mock.Setup(m => m.ElementType).Returns(data?.ElementType);
mock.Setup(m => m.GetEnumerator()).Returns(() => data?.GetEnumerator());
}
private static void ConfigureAsyncEnumerableCalls<TEntity>(
this Mock<DbSet<TEntity>> mock,
IAsyncEnumerable<TEntity> enumerable)where TEntity : class
{
mock.Setup(d => d.GetAsyncEnumerator(It.IsAny<CancellationToken>()))
.Returns(() => enumerable.GetAsyncEnumerator());
}
private static async IAsyncEnumerable<TEntity> CreateAsyncMock<TEntity>(IEnumerable<TEntity> data)
where TEntity : class
{
foreach (var entity in data)
{
yield return entity;
}
await Task.CompletedTask;
}
}
}