动态调用异步方法

Dynamically call async method

我需要编写测试来验证多个 ASP.NET 核心路由下载一个 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);
}

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

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

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

    await VerifyExcelIsDownloaded(repoCall, controllerMethod);         
}

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

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

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