forked from ddrilling/AsbCloudServer
Add MockQueryable.Moq to moq DbContext and DbSets
This commit is contained in:
parent
fee2b19b46
commit
75a3ea410d
@ -13,6 +13,7 @@
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.8" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.8" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||
<PackageReference Include="MockQueryable.Moq" Version="6.0.1" />
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="xunit" Version="2.4.2" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||
|
@ -1,14 +1,12 @@
|
||||
using AsbCloudDb.Model;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using MockQueryable.Moq;
|
||||
using Moq;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AsbCloudWebApi.Tests
|
||||
{
|
||||
@ -29,9 +27,13 @@ namespace AsbCloudWebApi.Tests
|
||||
public static Mock<IAsbCloudDbContext> AddDbSetMock<T>(this Mock<IAsbCloudDbContext> contextMock, IEnumerable<T> dbSetData)
|
||||
where T : class
|
||||
{
|
||||
var dbSetMock = MakeDbSetMock(dbSetData);
|
||||
var mockDbSet = dbSetData
|
||||
.ToList()
|
||||
.AsQueryable()
|
||||
.BuildMockDbSet();
|
||||
|
||||
contextMock.Setup(o => o.Set<T>())
|
||||
.Returns(() => dbSetMock.Object);
|
||||
.Returns(mockDbSet.Object);
|
||||
|
||||
var dbSetProperty = typeof(IAsbCloudDbContext)
|
||||
.GetProperties()
|
||||
@ -43,84 +45,10 @@ namespace AsbCloudWebApi.Tests
|
||||
var objParameterExpr = Expression.Parameter(typeof(IAsbCloudDbContext), "instance");
|
||||
var propertyExpr = Expression.Property(objParameterExpr, dbSetProperty);
|
||||
var expression = Expression.Lambda<Func<IAsbCloudDbContext, DbSet<T>>>(propertyExpr, objParameterExpr);
|
||||
contextMock.SetupGet(expression).Returns(dbSetMock.Object);
|
||||
contextMock.SetupGet(expression).Returns(mockDbSet.Object);
|
||||
}
|
||||
|
||||
return contextMock;
|
||||
}
|
||||
|
||||
public static Mock<DbSet<T>> MakeDbSetMock<T>()
|
||||
where T : class
|
||||
=> MakeDbSetMock(new List<T>());
|
||||
|
||||
class DummyAsyncQueriable<T> : IQueryable<T>, IAsyncEnumerable<T>
|
||||
{
|
||||
private readonly IQueryable<T> queriable;
|
||||
|
||||
public Type ElementType => queriable.ElementType;
|
||||
|
||||
public Expression Expression => queriable.Expression;
|
||||
|
||||
public IQueryProvider Provider => queriable.Provider;
|
||||
|
||||
class QueriableAsyncEminaretor<T2> : IAsyncEnumerator<T2>
|
||||
{
|
||||
private readonly IEnumerator<T2> syncEnumerator;
|
||||
|
||||
public QueriableAsyncEminaretor(IEnumerator<T2> syncEnumerator)
|
||||
{
|
||||
this.syncEnumerator = syncEnumerator;
|
||||
}
|
||||
|
||||
public T2 Current => syncEnumerator.Current;
|
||||
|
||||
public ValueTask DisposeAsync()
|
||||
{
|
||||
syncEnumerator.Dispose();
|
||||
return ValueTask.CompletedTask;
|
||||
}
|
||||
|
||||
public ValueTask<bool> MoveNextAsync()
|
||||
{
|
||||
var result = syncEnumerator.MoveNext();
|
||||
return ValueTask.FromResult(result);
|
||||
}
|
||||
}
|
||||
|
||||
public DummyAsyncQueriable(IEnumerable<T> dbSetData)
|
||||
{
|
||||
queriable = dbSetData.ToList().AsQueryable();
|
||||
}
|
||||
|
||||
public IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default)
|
||||
{
|
||||
var enumerator = this.AsEnumerable().GetEnumerator();
|
||||
return new QueriableAsyncEminaretor<T>(enumerator);
|
||||
}
|
||||
|
||||
public IEnumerator<T> GetEnumerator()
|
||||
=> queriable.GetEnumerator();
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
=> queriable.GetEnumerator();
|
||||
}
|
||||
|
||||
public static Mock<DbSet<T>> MakeDbSetMock<T>(IEnumerable<T> dbSetData)
|
||||
where T : class
|
||||
{
|
||||
var dbSetDataQueriable = new DummyAsyncQueriable<T>(dbSetData);
|
||||
|
||||
Mock<DbSet<T>> dbSetMock = new();
|
||||
dbSetMock.As<IQueryable<T>>().Setup(o => o.Provider).Returns(() => dbSetDataQueriable.Provider);
|
||||
dbSetMock.As<IQueryable<T>>().Setup(o => o.Expression).Returns(() => dbSetDataQueriable.Expression);
|
||||
dbSetMock.As<IQueryable<T>>().Setup(o => o.ElementType).Returns(() => dbSetDataQueriable.ElementType);
|
||||
dbSetMock.As<IQueryable<T>>().Setup(o => o.GetEnumerator()).Returns(() => dbSetDataQueriable.GetEnumerator());
|
||||
|
||||
dbSetMock.As<IAsyncEnumerable<T>>()
|
||||
.Setup(o => o.GetAsyncEnumerator(It.IsAny<CancellationToken>()))
|
||||
.Returns(() => dbSetDataQueriable.GetAsyncEnumerator());
|
||||
|
||||
return dbSetMock;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user