ASP.Net Core unit testing async controller [duplicate]

元气小坏坏 提交于 2019-12-02 00:35:23
Nkosi

Using the test classes from this answer :

How to mock an async repository with Entity Framework Core

The following generic extension method was derived

public static Mock<DbSet<T>> ToAsyncDbSetMock<T>(this IEnumerable<T> source)
    where T : class {

    var data = source.AsQueryable();

    var mockSet = new Mock<DbSet<T>>();

    mockSet.As<IAsyncEnumerable<T>>()
        .Setup(m => m.GetEnumerator())
        .Returns(new TestAsyncEnumerator<T>(data.GetEnumerator()));

    mockSet.As<IQueryable<T>>()
        .Setup(m => m.Provider)
        .Returns(new TestAsyncQueryProvider<T>(data.Provider));

    mockSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(data.Expression);
    mockSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(data.ElementType);
    mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => data.GetEnumerator());

    return mockSet;
}

With the above extension method the test can be refactored to

[Fact]
public async Task Can_Paginate() {

    //Arrange

    var products = GetFakeProducts().ToAsyncDbSetMock();    
    var productCategories = GetFakeProductCategories().ToAsyncDbSetMock();

    var customDbContextMock = new Mock<ApplicationDbContext>();
    customDbContextMock.Setup(x => x.Products).Returns(products.Object);
    customDbContextMock.Setup(x => x.ProductCategories).Returns(productCategories.Object);

    //...other code removed for brevity

    var controller = new ProductsController(customDbContextMock.Object, loggerMock.Object, envMock.Object);
    controller.pageSize = 3;
    controller.ControllerContext = new ControllerContext(actionContext);

    //Act
    var result = await controller.List(1, 2);

    //Assert

    //...other code removed for brevity
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!