gpt4 book ai didi

c# - 在 Visual Studio 2013 中使用 HttpClient 进行单元测试/集成测试 Web API

转载 作者:可可西里 更新时间:2023-11-01 07:53:24 27 4
gpt4 key购买 nike

我很难尝试使用 Visual Studio 2013 测试我的 API Controller 。我的一个解决方案有一个 Web API 项目和一个测试项目。在我的测试项目中,我有一个单元测试:

[TestMethod]
public void GetProduct()
{
HttpConfiguration config = new HttpConfiguration();
HttpServer _server = new HttpServer(config);

var client = new HttpClient(_server);

var request = new HttpRequestMessage
{
RequestUri = new Uri("http://localhost:50892/api/product/hello"),
Method = HttpMethod.Get
};

request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

using (var response = client.SendAsync(request).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

var test = response.Content.ReadAsAsync<CollectionListDTO>().Result;
}
}

我一直收到 404。我曾尝试使用 Visual Studio (IIS Express) 的一个实例运行我的 API,并尝试在另一个实例中调试此单元测试。但没有运气。我已经验证我可以将此 URL 放入浏览器中(当一个 Visual Studio 正在调试时)并且我看到了我的 JSON 响应。但我不知道如何让它与我的单元测试和 HttpClient 一起工作。我试图在网上找到示例,但似乎找不到。有人可以帮忙吗?

更新 1:我尝试添加路线但没有任何反应。

HttpConfiguration config = new HttpConfiguration();

// Added this line
config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/product/hello/");

HttpServer _server = new HttpServer(config);

var client = new HttpClient(_server);

[...rest of code is the same]

这是我的 API Controller

[HttpGet]
[Route("api/product/hello/")]
public IHttpActionResult Hello()
{
return Ok();
}

更新决议:如果我在没有 HttpServer 对象的情况下新建 HttpClient ,我就能够让它工作。不过,我仍然需要运行两个 VS 实例。 1 运行我的 API 代码,另一个运行单元测试。

这是一个工作方法。

[TestMethod]
public void Works()
{
var client = new HttpClient(); // no HttpServer

var request = new HttpRequestMessage
{
RequestUri = new Uri("http://localhost:50892/api/product/hello"),
Method = HttpMethod.Get
};

request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

using (var response = client.SendAsync(request).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}
}

有人知道为什么它不能与 HttpServer 和传递给 HttpClientHttpConfiguration 一起工作吗?我见过很多使用它的示例。

最佳答案

引用以下文章我能够做到...

ASP.NET Web API integration testing with in-memory hosting

通过使用 HttpServer 和传递给 HttpClientHttpConfiguration。在下面的示例中,我创建了一个使用属性路由的简单 ApiController。我配置了 HttpConfiguration 来映射属性路由,然后将其传递给新的 HttpServerHttpClient 然后可以使用配置的服务器对测试服务器进行集成测试调用。

public partial class MiscUnitTests {
[TestClass]
public class HttpClientIntegrationTests : MiscUnitTests {

[TestMethod]
public async Task HttpClient_Should_Get_OKStatus_From_Products_Using_InMemory_Hosting() {

var config = new HttpConfiguration();
//configure web api
config.MapHttpAttributeRoutes();

using (var server = new HttpServer(config)) {

var client = new HttpClient(server);

string url = "http://localhost/api/product/hello/";

var request = new HttpRequestMessage {
RequestUri = new Uri(url),
Method = HttpMethod.Get
};

request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

using (var response = await client.SendAsync(request)) {
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}
}
}
}

public class ProductController : ApiController {
[HttpGet]
[Route("api/product/hello/")]
public IHttpActionResult Hello() {
return Ok();
}
}
}

无需运行另一个 VS 实例即可对 Controller 进行集成测试。

以下简化版本的测试也有效

var config = new HttpConfiguration();
//configure web api
config.MapHttpAttributeRoutes();

using (var server = new HttpServer(config)) {

var client = new HttpClient(server);

string url = "http://localhost/api/product/hello/";

using (var response = await client.GetAsync(url)) {
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}
}

在您的情况下,您需要确保正确配置服务器以匹配您的网络 API 设置。这意味着您必须使用 HttpConfiguration 对象注册您的 api 路由。

var config = new HttpConfiguration();
//configure web api
WebApiConfig.Register(config);
//...other code removed for brevity

关于c# - 在 Visual Studio 2013 中使用 HttpClient 进行单元测试/集成测试 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475387/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com