简体   繁体   English

单元测试任务<IActionResult>

[英]Unit Test Task<IActionResult>

I am working on a .Net Core Web API application. 我正在开发.Net Core Web API应用程序。 I have the following method on my controller: 我的控制器上有以下方法:

[HttpGet]
public async Task<IActionResult> GetArtists()
{
  var permissions = await _permissionsService.GetPermissionsAsync(HttpContext);
  var artists = _artistsService.GetAllArtists(permissions.UserId, permissions.IsAdministrator);
  return Ok( new { artists });
}

I want to write a test that would assert that I am indeed getting a 200 OK Result. 我想写一个测试,断言我确实得到了200 OK的结果。

I've tried the following: 我尝试过以下方法:

[TestMethod]
public void GetArtists_ReturnsOKStatusCode()
{
  // arrange
  var artistsController = new ArtistsController(_mockPermissionsService.Object, _mockArtistsService.Object, _mockLogger.Object);
  // act
  var getArtistsResult = artistsController.GetArtists();
  var okResult = getArtistsResult as OkObjectResult;

  Assert.IsInstanceOfType(okResult, OkObjectResult)
}

But I get an error on the line where I am casting to OkObjectResult . 但是我在转换为OkObjectResult的行上出现错误。 It says I can't convert type Task<IActionResult> to OkObjectResult 它说我无法将类型Task<IActionResult>转换为OkObjectResult

You need to use await when calling asynchronous methods: 调用异步方法时需要使用await

var getArtistsResult = await artistsController.GetArtists();

This in turn makes your test method async Task : 这反过来使您的测试方法async Task

[TestMethod]
public async Task GetArtists_ReturnsOKStatusCode()
{
  ...
}

You need to receive result of function GetArtists() (not Task), like this: 你需要接收函数GetArtists()(不是Task)的结果,如下所示:

var getArtistsResult = artistsController.GetArtists().Result;

Then you can cast it to OkObjectResult. 然后你可以把它强制转换为OkObjectResult。

Or you can try to change your test like this : 或者您可以尝试更改您的测试:

[TestMethod]
public async Task GetArtists_ReturnsOKStatusCode()
{
  // arrange
  var artistsController = new ArtistsController(_mockPermissionsService.Object, _mockArtistsService.Object, _mockLogger.Object);
  // act
  var getArtistsResult = await artistsController.GetArtists();
  var okObjectResult = settings.Should().BeOfType<OkObjectResult>().Subject;
  var result = okObjectResult.Value.Should().BeAssignableTo<SomeType>();
}

I used some extending methods from FluentAssetions lib, its very useful. 我使用了一些来自FluentAssetions lib的扩展方法,它非常有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何为返回十进制的 IActionResult 控制器操作创建单元测试? - How to create a unit test for an IActionResult controller action which returns decimal? 使用 Moq for Task 的 xUnit 测试<iactionresult>类型方法</iactionresult> - xUnit test using Moq for Task<IActionResult> type method Ok()如何兼具任务 <IActionResult> 和IActionResult? - How can Ok() be both Task<IActionResult> and IActionResult? 如何从任务中获取值<IActionResult>通过用于单元测试的 API 返回 - How to get the Values from a Task<IActionResult> returned through an API for Unit Testing 任务<iactionresult>得到错误的值</iactionresult> - Task<IActionResult> is getting the wrong value 如何测试异步任务<IActionResult>返回 IEnumerable<model> 在 xunit 中使用最小起订量? - How to test async Task<IActionResult> returning IEnumerable<model> using moq in xunit? 如何对任务parellelism进行单元测试 - How to unit test for Task parellelism 如何测试IActionResult及其内容 - How to test IActionResult and its content 异步任务 <IActionResult> vs任务 <T> - async Task<IActionResult> vs Task<T> 无法决定任务 <IActionResult> ,IActionResult和ActionResult <Thing> - Can't decide between Task<IActionResult>, IActionResult and ActionResult<Thing>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM