【问题标题】:Why is this HttpRequestMessage's request URI invalid?为什么这个 HttpRequestMessage 的请求 URI 无效?
【发布时间】:2021-12-23 20:27:06
【问题描述】:

我正在尝试编写一个集成测试来测试我的应用程序的注册功能。这是控制器:

[Route("account")]
public class IdentityController : MainController
{
    // ...

    [HttpGet("signup")]
    public IActionResult SignUp()
    {
        return View();
    }

    [HttpPost("signup")]
    public async Task<IActionResult> SignUp(UserSignUpViewModel signUp)
    {
        if (!ModelState.IsValid)
        {

我正在参加在线培训,根据视频以及周围的其他示例,这就是应该如何测试表单提交:

[Fact]
public async Task Identity_CreateUser_ShouldBeSuccessful()
{
    // Arrange
    var initialResponse = await _fixture.Client.GetAsync("/account/signup");
    initialResponse.EnsureSuccessStatusCode();

    var antiForgeryToken = _fixture.GetAntiForgeryToken(await initialResponse.Content.ReadAsStringAsync());

    var postRequest = new HttpRequestMessage(HttpMethod.Post, "/account/signup")
    {
        Content = new FormUrlEncodedContent(new Dictionary<string, string>
        {
            { "Name", "John Malone Doe" },
            // ...
        }
    }

    // Act
    var response = await _fixture.Client.SendAsync(postRequest);

    // ...

Rider 甚至会为我自动完成路径,但它会失败并显示一条消息:

System.InvalidOperationException:提供了无效的请求 URI。请求 URI 必须是绝对 URI,或者必须设置 BaseAddress。

我尝试传递完整地址“https://localhost:5001/account/signup”,并以这种方式编写代码:

var postRequest = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://localhost:5001/account/signup"),
    Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {

没有解决。

【问题讨论】:

  • 你确定有一个服务器在 https localhost:5001 监听吗?您可以尝试在浏览器中打开此网址查看
  • 这可能是因为您使用的是 HTTPS 协议。本地主机通常在 HTTP 上运行。而不是"https://localhost:5001/account/signup",尝试"http://localhost:5001/account/signup"(HTTP 后没有's')。
  • @Renat,是的,我是。我启动了服务器并手动测试了所有内容。
  • @BrendanR,你看,initialResponse 代码工作正常,它具有与问题顶部相同的端点。另外,如果我为HttpRequestMessage 输入一个不存在的端点,测试将失败,说它没有找到。我相信这是另外一回事,但让我尝试在此处调整它以仅使用 HTTP。
  • @BrendanR.,它仍然存在!

标签: c# integration-testing .net-5


【解决方案1】:

似乎 URI 需要尾部斜杠才能有效

见:Create new URI from Base URI and Relative Path - slash makes a difference?

而不是https://localhost:5001/account/signup,试试https://localhost:5001/account/signup/

(秒尾有斜线)

不过我还没有测试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2016-07-27
    • 2012-02-06
    相关资源
    最近更新 更多