2017-12-20 8 views
0

Ich versuche, Komponententest-Projekt zu erstellen, um einen Web-API-Dienst zu testen, und möchte in Speicherhosting-Lösung wie OWIN verwenden, würde ich gerne wissen, ist es möglich und auch möglich, dass das Web-API-Projekt wäre Mit IIS ausführen und nur das Testprojekt wird im Speicher ausgeführt?Wie Komponententest Web API im Speicher Hosting-Framework verwenden, während Web-API immer noch auf iis läuft?

Gibt es im Speicher-Hosting-Framework eine Empfehlung?

Antwort

1

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.

+0

Danke für die schnelle Antwort. –

+0

@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). –

+0

@BrockAdams tat ich, danke –

Verwandte Themen