2017-12-20 27 views
0

웹 API 서비스를 테스트하기 위해 컴포넌트 테스트 프로젝트를 만들고 싶습니다. OWIN과 같은 솔루션을 호스팅하는 메모리에서 사용하고 싶습니다. 가능하다는 것을 알고 싶습니다. 또한 웹 API 프로젝트가 IIS로 실행하면 테스트 프로젝트 만 메모리에서 실행됩니까?웹 API가 iis에서 실행되는 동안 메모리 호스팅 프레임 워크에서 구성 요소 테스트 웹 API를 구성하는 방법은 무엇입니까?

메모리 호스팅 프레임 워크에는 어떤 것이 있습니까?

답변

1

실행중인 버전의 API에 대해 테스트 할 수 있도록 Owin을 사용하여 API를 자체 호스팅 할 수 있습니다. 그러나 API를 실제로 호스트 할 필요없이 유닛 테스트를 사용하여 컨트롤러 로직을 테스트 할 수 있어야합니다.

자체가 콘솔 응용 프로그램에서 호스팅 here를 설명 :

아직도, 단위 테스트에서 그들을 호스트 타당한 이유가있을 수 있습니다 그래서 여기 우리는 간다. 콘솔 응용 프로그램에서 실행할 수 있으면 단위 테스트 프로젝트에서도 실행할 수 있습니다.

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; 
    } 
} 

지금, 당신의 컨트롤러는 아마 테스트 어셈블리보다 다른 어셈블리에 살고 테스트 : 예 (의사 코드) 될 수 있습니다. 유닛 테스트 프로젝트를 위해 어셈블리 리졸버를 사용하여 API를 발견해야 할 수도 있습니다. 내 답변에 표시된대로 자신의 AssembliesResolver를 작성할 수 있습니다.

알아 두십시오. 설정에 따라 테스트 환경이 실제 시나리오와 일치하는지 확인해야합니다. IIS와 자체 호스팅 웹 API간에 미묘한 차이가있을 수 있습니다. 메모리 호스팅 환경을 설정하는 데 필요한 여러 매개 변수가있을 때

+0

빠른 답변 감사드립니다. –

+0

@ ReaB.,이 답변이 도움이 될 경우 [표시하십시오] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)를 입력하십시오. –

+0

@BrockAdams 감사합니다. –