动态调用异步方法
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 )
测试方法创建一个控制器并将其传递给执行实际工作的函数。
我需要编写测试来验证多个 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 )
测试方法创建一个控制器并将其传递给执行实际工作的函数。