我已经通过以下设置设置了一个基本的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!");
}
}
}
对于我的Tests项目,我正在使用NUnit
进行测试,它有两个类:抽象的BaseTest
类和ControllerTests
类,其中包含一个旨在发送的测试来自上述TestController
的{{1}}操作方法的网络请求:
BaseTest:
GET
ControllerTests:
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);
响应。
我不确定是我做错了什么,无论是不是设置属性还是未映射的Api路由。
更新:这是我的404: Not Found
方法供参考:
WebApiConfig.Register()
答案 0 :(得分:1)
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
}
}
答案 1 :(得分:1)
由于我的Startup
的{{1}}方法中没有包含所有的代码,因此我的Tests项目似乎不知道API在启动时所做的所有DI操作。
在我的代码的旧版本中,我的Configuration
方法中包含以下两行:
Configuration
返回时,我从app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel);
app.UseNinjectWebApi(configuration);
方法中删除了这两行,但我不明白它们为什么在那里。如果在启动时绑定依赖项,则似乎这两行只是多余的。
虽然的确如此,但在从我的Tests项目引用此{{1}}类的情况下,我需要两个都可以,以便我的Test项目可以正确处理依赖项。