ребята из моей команды пишут такие вещи:
[HttpPost("do")]
public async Task<ActionResult> DoAsync()
{
try
{
var obj = await this.DoThing();
return new JsonResult(obj);
}
catch (StatusCodeException x)
{
return StatusCode(x.StatusCode, new { x.Message, x.StackTrace });
}
catch (Exception x)
{
return StatusCode(500, x.GenerateMessage(" "));
}
}
Это означает, что JsonResult
или ObjectResult
могут быть возвращены, что усложняет тестирование. Это потому, что JsonResult
и ObjectResult
не не происходят друг от друга. Кто-нибудь знает, почему это так?
Мне пришлось написать небольшой класс-обертку для тестирования, чтобы сделать жизнь немного проще:
/// <summary>
/// Defines all subclasses of <see cref="ActionResult"/>
/// that have status codes and <see cref="object"/> values.
/// </summary>
public class ObjectValueActionResult
{
/// <summary>
/// Initializes a new instance of the <see cref="ObjectValueActionResult"/> class.
/// </summary>
/// <param name="result">The result.</param>
/// <remarks>
/// The majority of <see cref="IActionResult"/> instances like <see cref="OkObjectResult"/> derive
/// from <see cref="ObjectResult"/>.
/// </remarks>
public ObjectValueActionResult(IActionResult result)
{
Assert.NotNull(result);
switch (result)
{
case JsonResult j:
this.Value = j.Value;
this.StatusCode = j.StatusCode;
break;
case NoContentResult n:
this.StatusCode = n.StatusCode;
break;
case ObjectResult o:
this.Value = o.Value;
this.StatusCode = o.StatusCode;
break;
default:
throw new NotImplementedException($"The expected {nameof(IAsyncResult)} type is not here.");
}
}
/// <summary>
/// Gets or sets the value.
/// </summary>
/// <value>
/// The value.
/// </value>
public object Value { get; set; }
/// <summary>Gets or sets the HTTP status code.</summary>
public int? StatusCode { get; set; }
}
Есть ли альтернатива этому?