无法在使用 Http 服务器的单元测试中使用 URL 中的 int 参数调用 web api 2 post 方法

Cannot call web api 2 post method with int parameter in URL in Unit Test using Http server

请忽略拼写错误,我无法复制代码,所以我输入了全部内容并更改了控制器和方法的名称。

网页版 API 2

控制器:

// Controller name is Test
public HttpResponseMessage Method1(int param1)   // Post method
{
    // return string
}

如果我在测试用例中创建一个控制器对象,那么它工作正常。但是,如果我想使用以下代码在本地主机中进行测试:

单元测试:

public void Method1Test()
{
    HttpResponseMessage response;
    HttpConfiguration config = new HttpConfiguration();
    config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
    HttpServer server = new HttpServer(config);
    using(var client = new HttpClient(server))
    {
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5022/api/test?param1=1");
        request.Content = new ObjectContent<int>(param1, new JsonMediaTypeFormatter());
        response = client.SendAsync(request, CancellationToken.None).Result;
    };
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}

现在,我的测试用例失败了。我在不同的项目中使用了相同的代码并且它有效。可能是我尝试调用 Post 方法的方式。这是在 URL 中使用 Int 参数调用 post 方法的正确方法吗?

在帮助页面中,在 API 列下显示:

POST api/test/param1={param1}

另外,我在实际服务中设置了一些停止点,我的光标没有在那个点停止。为什么?

如果我想从浏览器调用相同的服务,我应该传递什么 URL?是吗-

http://localhost:5022/api/test?param1=1

还是别的?

我明白了。以下是正确的单元测试方法,但这有一些我之前没有提供的额外信息,即传递对象作为服务的输入。

private void Method1Test(ObjectClass obj)
{
    HttpResponseMessage response = null;
    HttpConfiguration config = new HttpConfiguration();
    config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
    HttpServer server = new HttpServer(config);
    using (var client = new HttpClient(server))
    {
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5022/api/test/1");
        request.Content = new ObjectContent<ObjectClass>(obj, new JsonMediaTypeFormatter());
        response = client.SendAsync(request, CancellationToken.None).Result;
    };
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}

所以我要找的正确 URL 是

http://localhost:5022/api/test/1

抱歉,post 这个答案花了很长时间。这种方法在 2 年多的时间里一直很有效。