相关疑难解决方法(0)

如何将此EF Mock设置代码编写为可重用的Generic Boilerplate?

我正在使用moq,ef 6和xunit.我发现自己一遍又一遍地编写这段代码,并认为我可以把它变成一种通用的方法但是有些麻烦.

public static void CreateSalesMock(List<Sale> sales, Mock<DatabaseContext> dbContextMock)
{
    var data = sales.AsQueryable();

    var mockSet = new Mock<DbSet<Sale>>();
    mockSet.As<IQueryable<Sale>>()
           .Setup(x => x.Provider)
           .Returns(data.Provider);
    mockSet.As<IQueryable<Sale>>()
           .Setup(x => x.Expression)
           .Returns(data.Expression);
    mockSet.As<IQueryable<Sale>>()
           .Setup(x => x.ElementType)
           .Returns(data.ElementType);
    mockSet.As<IQueryable<Sale>>()
           .Setup(x => x.GetEnumerator())
           .Returns(data.GetEnumerator());

    dbContextMock.Setup(x => x.Sales).Returns(mockSet.Object);
}
Run Code Online (Sandbox Code Playgroud)

现在我在我的数据库中有许多其他表,所以如果我可以编写一个方法来接收该数据的列表并进行设置,那么我可以通过它进行模拟查询会很棒.

public static void CreateMockSet<T, TA, TB>(T dataList, TA model, 
    Func<TB> lambda, Mock<DatabaseContext> dbContextMock) 
     where T : List<T>
     where TA: Mock<DbSet<TA>>
{
    var data = dataList.AsQueryable();

    model.As<IQueryable<T>>()
         .Setup(x => x.Provider)
         .Returns(data.Provider);
    model.As<IQueryable<T>>()
         .Setup(x => x.Expression)
         .Returns(data.Expression);
    model.As<IQueryable<T>>() …
Run Code Online (Sandbox Code Playgroud)

c# generics unit-testing entity-framework moq

5
推荐指数
1
解决办法
1299
查看次数

标签 统计

c# ×1

entity-framework ×1

generics ×1

moq ×1

unit-testing ×1