设定
我想做什么
针对使用PATCH动词的Web API中的控制器方法运行集成测试
MyController.cs
namespace FluidIT.API.Controllers
{
[Route("api/v1/[controller]")]
[ApiController]
public class MyController : ControllerBase
{
private readonly IMediator _mediator;
private readonly IMyQueries _myQueries;
public JobsController(IMediator mediator, IMyQueries myQueries)
{
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
_myQueries = myQueries ?? throw new ArgumentNullException(nameof(myQueries));
}
// PATCH: api/v1/my/{id}
[Route("id:int")]
[HttpPatch]
public async Task<IActionResult> RemoveMeAsync(int id)
{
bool commandResult = false;
try
{
commandResult = await _mediator.Send(new RemoveMeCommand(id));
return NoContent();
}
catch (NotFoundException)
{
return NotFound(id);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
MyIntegrationTest.cs
[Fact]
async Task Patch_MyAsync_WhenIdNotFound_ReturnsNotFoundStatusCode()
{
// Arrange
var request = new HttpRequestMessage()
{
RequestUri = new Uri($"{_fixture.Client.BaseAddress}{_baseRoute}/1"),
Method = HttpMethod.Patch,
Headers =
{
{ HttpRequestHeader.ContentEncoding.ToString(), Encoding.UTF8.ToString() },
{ HttpRequestHeader.ContentType.ToString(), "application/json" }
}
};
// Act
var response = await _fixture.Client.SendAsync(request);
// Assert
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我做了什么
我已经看到了,这是当试图使用一个相当普遍的现象PUT,PATCH或DELETEHTTP动词。我还看到建议将以下内容添加到web.config文件中以webDAV从IIS中删除模块
web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是,您可能已经猜到了,该解决方案不适用于我。我的测试返回一个405 MethodNotAllowed响应。
关于此主题的大多数信息似乎是从前不久开始的,因此我想在这里专门针对ASP.NET Core API提出问题。
要解决此问题,请更正路径约束语法,将参数和数据类型括在花括号内 [Route("{id:int}")]
[Route("{id:int}")]
[HttpPatch]
public async Task<IActionResult> RemoveMeAsync(int id)
{
bool commandResult = false;
try
{
commandResult = await _mediator.Send(new RemoveMeCommand(id));
return NoContent();
}
catch (NotFoundException)
{
return NotFound(id);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6970 次 |
| 最近记录: |