EF核心单元测试模拟

时间:2017-10-17 11:52:49

标签: c# entity-framework unit-testing asp.net-core

我试图嘲笑EF Core的一些功能。

最初我收到以下错误

  

源IQueryable的提供程序未实现IAsyncQueryProvider。只有实现IEntityQueryProvider的提供程序才能用于Entity Framework异步操作。

在查看https://electron.atom.io/docs/api/app/#event-certificate-error问题后,它似乎有效,但我现在得到以下内容:

  

System.ArgumentNullException:值不能为null。   参数名称:source      在Microsoft.EntityFrameworkCore.Utilities.Check.NotNull [T](T值,String parameterName)      在Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.FirstOrDefaultAsync [TSource](IQueryable 1 source, Expression 1谓词,CancellationToken cancellationToken)      在C:\ Users \ Jamie.Rees \ Source \ Repos \ PlexRequests.Net \ src \ Ombi.Core \ Rule \ Rules \ Search \ RadarrCacheRule中的Ombi.Core.Rule.Rules.Search.RadarrCacheRule.d__2.MoveNext()处。 cs:第25行

这是测试代码:

[Test]
public async Task Should_ReturnApproved_WhenMovieIsInRadarr()
{
    var list = new List<RadarrCache>(){new RadarrCache
    {
        TheMovieDbId = 123
    }}.AsQueryable();
    var radarrMock = new Mock<DbSet<RadarrCache>>();
    radarrMock.As<IAsyncEnumerable<RadarrCache>>()
        .Setup(m => m.GetEnumerator())
        .Returns(new TestAsyncEnumerator<RadarrCache>(list.GetEnumerator()));


    radarrMock.As<IQueryable<RadarrCache>>()
        .Setup(m => m.Provider)
        .Returns(new TestAsyncQueryProvider<RadarrCache>(list.Provider));

    radarrMock.As<IQueryable<RadarrCache>>().Setup(m => m.Expression).Returns(list.Expression);
    radarrMock.As<IQueryable<RadarrCache>>().Setup(m => m.ElementType).Returns(list.ElementType);
    radarrMock.As<IQueryable<RadarrCache>>().Setup(m => m.GetEnumerator()).Returns(() => list.GetEnumerator());


    ContextMock.Setup(c => c.Set<RadarrCache>()).Returns(radarrMock.Object);

    var request = new SearchMovieViewModel { Id = 123 };
    var result =await  Rule.Execute(request);

    Assert.True(result.Success);
    Assert.True(request.Approved);
}

这是受测试的课程:

public class RadarrCacheRule : BaseSearchRule, IRules<SearchViewModel>
{
    public RadarrCacheRule(IOmbiContext ctx)
    {
        _ctx = ctx;
    }

    private readonly IOmbiContext _ctx;

    public async Task<RuleResult> Execute(SearchViewModel obj)
    {
        if (obj.Type == RequestType.Movie)
        {
            // Check if it's in Radarr
            var result = await _ctx.RadarrCache.FirstOrDefaultAsync(x => x.TheMovieDbId == obj.Id);
            if (result != null)
            {
                obj.Approved =
                    true; // It's in radarr so it's approved... Maybe have a new property called "Processing" or something?
            }
        }
        return Success();
    }
}

知道我怎么想这样做?

0 个答案:

没有答案