我已经设置了一个基本的Web API项目来测试编写集成测试,设置如下
启动:
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(WebApiTest.Startup))]
namespace WebApiTest
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
WebApiConfig.Register(new System.Web.Http.HttpConfiguration());
}
}
}
以及以下控制器:
using System.Web.Http;
namespace WebApiTest.Controllers
{
public class TestController : ApiController
{
public IHttpActionResult Post()
{
return Ok("Hello, world!");
}
}
}
对于我的测试项目,我使用NUnit
进行测试,并且有两个类:一个抽象BaseTest
类和一个包含一个测试的ControllerTests
类,目的是将Web请求发送到上述TestController
的GET
Action方法:
基础测试:
using Microsoft.Owin.Testing;
using NUnit.Framework;
using System;
using System.Net.Http;
namespace WebApiTest.Tests
{
public abstract class BaseTest : IDisposable
{
protected const string _url = "http://localhost/";
protected TestServer _server;
public void Dispose()
{
_server.Dispose();
}
[SetUp]
public void SetUp()
{
_server = TestServer.Create<Startup>();
}
protected HttpRequestMessage CreateRequest(string url, string
contentType, HttpMethod method)
{
HttpRequestMessage request = new HttpRequestMessage
{
RequestUri = new Uri(_url + url),
Method = method
};
request.Headers.Accept.Add(new
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType));
return request;
}
}
}
控制器测试:
using FluentAssertions;
using NUnit.Framework;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace WebApiTest.Tests
{
[TestFixture]
public class ControllerTests : BaseTest
{
[Test]
public async Task Test1()
{
HttpRequestMessage request = CreateRequest("test", "application/json", HttpMethod.Post);
HttpResponseMessage response = await _server.HttpClient.SendAsync(request);
response.StatusCode.Should().Be(HttpStatusCode.OK);
}
}
}
我遇到的问题是我无法通过呼叫await _server.HttpClient.SendAsync(request);
到达我的端点,因为我总是得到404: Not Found
响应。
我不完全确定我做错了什么,无论是不是设置属性还是未映射的 Api 路由。
更新:这是我WebApiConfig.Register()
方法供参考:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Web API 配置不正确,因此它不知道路由
如果使用 OWIN 自托管,请创建新的
HttpConfiguration
实例。在此实例上执行任何配置,然后将实例传递给Owin.UseWebApi
扩展方法。
public class Startup {
public void Configuration(IAppBuilder app) {
var config = new System.Web.Http.HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config); //<-- THIS WAS MISSING
}
}
参考使用 OWIN 自承载配置 Web API
看来我的测试项目不知道我的 API 在启动时所做的所有 DI,因为所有代码都没有包含在我Startup
的 Configuration
方法中。
在我的代码的旧版本中,我的Configuration
方法中有以下两行:
app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel);
app.UseNinjectWebApi(configuration);
当我从Configuration
方法中删除这两行时,我不明白为什么它们在那里。如果依赖项在启动时绑定,则这两行似乎只是多余的。
虽然这是真的,但在从我的测试项目中引用这个Startup
类的情况下,我需要这两个类,以便我的测试项目可以正确处理依赖项。