gpt4 book ai didi

entity-framework - 使用Moq和Autofac在单元测试中 Entity Framework 的扩展方法

转载 作者:行者123 更新时间:2023-12-01 23:45:29 24 4
gpt4 key购买 nike

我正在 mock Entify Framework 中的 DbSet。我想使用它的扩展方法ToListAsync。这就是我的做法,下面是我尝试的结果(常规 ToList 有效):

IQueryable<DbUser> userData = MockedData.Instance.Users; // this is just a property to get custom IQueryable set of data for testing

var dbSetMock = new Mock<DbSet<DbUser>>();

dbSetMock.As<IQueryable<DbUser>>().Setup(m => m.Provider).Returns(userData.Provider);
dbSetMock.As<IQueryable<DbUser>>().Setup(m => m.Expression).Returns(userData.Expression);
dbSetMock.As<IQueryable<DbUser>>().Setup(m => m.ElementType).Returns(userData.ElementType);
dbSetMock.As<IQueryable<DbUser>>().Setup(m => m.GetEnumerator()).Returns(userData.GetEnumerator());

/*
I've put it here so you can see how I tried to approach my problem
dbSetMock.Setup(x => x.ToListAsync())
.Returns(Task.FromResult(userData.ToList()));
*/

var testAsync = dbSetMock.Object.ToListAsync();
var testRegular = dbSetMock.Object.ToList();

结果:

变量testRegular具有预期的值。但是变量 testAsync 的值如下:

test ToListAsync result

当我取消注释尝试设置 ToListAsync 以返回任何内容的部分时,我收到如下异常:

{"Expression references a method that does not belong to the mocked object: x => x.ToListAsync<DbUser>()"}

如有任何建议,我将不胜感激。我应该改用假货吗?那里支持这样的功能吗?

最佳答案

我找到并使用了this成功的代码:

dbSetMock.As<IDbAsyncEnumerable<DbUser>>()
.Setup(m => m.GetAsyncEnumerator())
.Returns(new AsyncEnumerator<DbUser>(userData.GetEnumerator()));

具有以下支持类(注意使用 C#6 速记功能):

class AsyncEnumerator<T> : IDbAsyncEnumerator<T>
{
private readonly IEnumerator<T> _inner;
public AsyncEnumerator(IEnumerator<T> inner)
{
_inner = inner;
}
public void Dispose() => _inner.Dispose();
public Task<bool> MoveNextAsync(CancellationToken cancellationToken) => Task.FromResult(_inner.MoveNext());
public T Current => _inner.Current;
object IDbAsyncEnumerator.Current => Current;
}

错误的根本原因是 Moq 无法模拟静态方法,至少目前是这样。

关于entity-framework - 使用Moq和Autofac在单元测试中 Entity Framework 的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com