动态调用异步方法

问题描述

我需要编写测试来验证多个 ASP.NET Core 路由是否下载了一个 Excel 电子表格。所以到目前为止我有这个:

private async Task VerifyExcelIsDownloaded(Expression<Action<IReportRepository>> repoCall)
{
    // Arrange
    var mock = new Mock<IReportRepository>();
    mock.Setup(repoCall);

    var controller = new ReportController(mock.Object);

    // Act
    var result = await controller.GetBadgeReadersDownloadAsync();
            
    // Assert
    Assert.IsType<FileStreamResult>(result);

    var file = result as FileStreamResult;
    Assert.Equal("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",file.ContentType);
}

我已经通过表达式参数处理了存储库调用,但是对于“行为”部分,我不知道如何替换 GetBadgeReadersDownloadAsync。我还需要将该方法调用传递到帮助方法中。

理想情况下,我最终会像这样进行多次测试:

[Fact]
public async Task GetBadgeReadersDownloadAsync_DownloadsExcel()
{
    Expression<Action<IReportRepository>> repoCall = x => x.GetBadgeReadersForBarcodesAsync();
    var controllerMethod = nameof(ReportController.GetBadgeReadersDownloadAsync);

    await VerifyExcelIsDownloaded(repoCall,controllerMethod);         
}

解决方法

原始海报(在问题下方的评论中)接受的答案是使用一个函数,该函数接受一个控制器并返回一个任务并将此函数与表达式一起传递给测试方法:

public async Task Verify...( Expression... repoCall,Func<Controller,Task<ActionResult>> actFunc )

测试方法创建一个控制器并将其传递给此函数,该函数在此处执行实际工作。