Sie können Owin verwenden, um Ihre API selbst zu hosten, damit Sie einen Test mit einer laufenden Version Ihrer API durchführen können. Sie sollten jedoch in der Lage sein, die Controller-Logik mithilfe von Komponententests zu testen, ohne dass Ihre APIs tatsächlich gehostet werden müssen.
Dennoch könnte es triftigen Grund sein, sie in einer Unit-Test-Host so hier gehen wir:
Selbst in einer Konsolenanwendung Hosting erklärt here. Wenn es in einer Konsolenanwendung ausgeführt werden kann, kann es auch in einem Komponententestprojekt ausgeführt werden. Ein Beispiel hierfür könnte (Pseudo-Code) sein:
using Microsoft.Owin.Hosting
using Owin
using System.Web.Http
using Microsoft.Owin.Cors
using System.Web.Http.Dispatcher
using System.Threading.Tasks
string service = "http://localhost:54321";
[TestMethod]
public async Task MyTest()
{
using (var webApp = WebApp.Start(service, BuildConfiguration))
{
var requestUrl = string.Format($"{service}/api/Foo/Bar");
var client = new HttpClient();
var response = await client.GetAsync(requestUrl);
Assert.IsTrue(response.IsSuccessStatusCode);
}
}
public void BuildConfiguration(IAppBuilder appBuilder)
{
var HttpConfiguration = new System.Web.Http.HttpConfiguration();
HttpConfiguration.Services.Replace(typeof(IAssembliesResolver), new AssembliesResolver());
HttpConfiguration.MapHttpAttributeRoutes();
HttpConfiguration.Routes.MapHttpRoute("DefaultApi",
$"api/{{controller}}/{{action}}/{{id}}", new { id = RouteParameter.Optional });
appBuilder.UseCors(CorsOptions.AllowAll);
appBuilder.UseWebApi(HttpConfiguration);
HttpConfiguration.EnsureInitialized();
}
[RoutePrefix("api/Foo")]
public class FooController : ApiController
{
[HttpGet]
[Route("Bar")]
public string GetBar()
{
return "Hello World";
}
}
public class AssembliesResolver : DefaultAssembliesResolver
{
private List<Assembly> assemblies;
public override ICollection<Assembly> GetAssemblies()
{
assemblies = new List<Assembly> { GetType().Assembly };
return assemblies;
}
}
jetzt Ihre Controller wahrscheinlich in einer anderen Assembly lebt zu testen, als in der Testanordnung. Möglicherweise müssen Sie einen Assembly-Resolver für das Unit-Test-Projekt verwenden, um Ihre APIs ermitteln zu können. Sie können Ihre eigenen AssembliesResolver dafür schreiben, wie in meiner Antwort gezeigt.
Beachten Sie jedoch. Abhängig von Ihrer Konfiguration müssen Sie sicherstellen, dass Ihre Testumgebung dem realen Szenario entspricht. Es kann feine Unterschiede zwischen IIS und selbst gehosteten Web-APIs geben, wenn es um die verschiedenen Parameter geht, die zum Einrichten der In-Memory-Hosting-Umgebung erforderlich sind.
Danke für die schnelle Antwort. –
@ReaB., Wenn diese Antwort für Sie funktioniert, bitte [markieren Sie es] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235). –
@BrockAdams tat ich, danke –