为了账号安全,请及时绑定邮箱和手机立即绑定

AspNet 核心集成测试 - MethodNotAllowed 响应

AspNet 核心集成测试 - MethodNotAllowed 响应

C#
当年话下 2022-06-18 16:37:10
我创建了一个带有 GET、POST、PUT 路由的 webapi 项目,这些路由在邮递员中运行良好。但是当我进行集成测试时,只有 GET 和 POST 路由通过。在集成测试中发出 PUT 请求时,它会抛出 MethodNotAllowed Error (405 - Method not allowed)。系统:Ubuntu 18.10 dotnet 版本:2.2.100任何建议/方向将不胜感激。namespace TestingMvc.Tests {public class JsonContent : StringContent {    public JsonContent (object obj):        base (JsonConvert.SerializeObject (obj), Encoding.UTF8, "application/json") { }}public class MyTest : IClassFixture<WebApplicationFactory<WebApi.Startup>> {    private readonly WebApplicationFactory<WebApi.Startup> _factory;    public MyTest (WebApplicationFactory<WebApi.Startup> factory) {        _factory = factory;    }    // This is Ok -> Returns 200    [Fact]    public async Task Get_Attachments () {        var client = _factory.CreateClient ();        var response = await client.GetAsync ("/attachments");        Assert.Equal (HttpStatusCode.OK, response.StatusCode);    }    // This is Ok -> returns 200    [Fact]    public async Task Post_Attachments () {        var client = _factory.CreateClient ();        var response = await client.PostAsync ("/attachments", new JsonContent(new { a = "foobaz" }));        Assert.Equal (HttpStatusCode.OK, response.StatusCode);    }    // This is not ok -> returns 405 Method not allowed    [Fact]    public async Task Put_Attachments () {        var client = _factory.CreateClient ();        var response = await client.PutAsync ("/attachments", new JsonContent(new { a = "foobaz" }));        Assert.Equal (HttpStatusCode.OK, response.StatusCode);    }}}
查看完整描述

2 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

我忘了发布我的控制器。


    // PUT Attachments/someguid

    [HttpPut ("{id}")]

    public ActionResult<AttachmentDto> Put (Guid id, [FromBody] AttachmentDto attachment) {

        return Ok (_attachmentService.CreateOrUpdate (id, attachment));

    }

因此,为该操作定义了一个 ID 参数,但在集成测试中它丢失了。它应该是:


var response = await client.PutAsync ("/attachments/01D7ACA3-575C-4E60-859F-DB95B70F8190", ...

这解决了我的问题。


查看完整回答
反对 回复 2022-06-18
?
忽然笑

TA贡献1806条经验 获得超5个赞

您是否将 Postman 通过的 Header 与您的测试构建的 Header 进行了比较?我可以看到的一件事可能是问题是您没有发送内容类型。

ContentType = "文本/json"


查看完整回答
反对 回复 2022-06-18
  • 2 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信