无法在使用 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 年多的时间里一直很有效。
请忽略拼写错误,我无法复制代码,所以我输入了全部内容并更改了控制器和方法的名称。
网页版 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 年多的时间里一直很有效。