簡體   English   中英

使用Moq和Autofac進行單元測試中實體框架的擴展方法

[英]Extension methods of Entity Framework in unit test using Moq and Autofac

我正在從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值如下:

測試ToListAsync結果

當我取消注釋我嘗試設置ToListAsync以返回任何內容的部分時,我得到如下的異常:

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

我很感激任何建議。 我應該切換到Fakes嗎? 是否支持這樣的功能?

我成功找到並使用了這段代碼:

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不能模擬靜態方法,至少目前是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM