1

콘솔 응용 프로그램에서 현재 생성자에 전달할 현재 http 컨텍스트가 필요한 서비스를 사용하고 싶습니다. 나는 Ninject를 사용하고 있으며, 단순히 HTTP 컨텍스트를 가짜로 만들고 적절한 바인딩을 정의 할 수 있다고 생각하지만, 성공하지 못하면서 몇 시간 동안이 작업에 어려움을 겪어 왔습니다.HttpContext와 HttpRequest를 가짜로 만들어 서비스 생성자에 삽입하는 방법

세부 사항 :

서비스는 실제로 ASP.Net MVC 프로젝트에서 오는 메일 링 서비스입니다. 나는 또한 IoC를 위해 Ninject를 사용하고있다. 메일 서비스는 생성자에 전달할 현재 http 컨텍스트를 필요로합니다.

kernel.Bind<IMyEmailService>().To<MyEmailService>() 
    .WithConstructorArgument("httpContext", ninjectContext => new HttpContextWrapper(HttpContext.Current)); 

그러나, 나는 밤에 자동화 된 작업을 실행하는 데 사용되는 콘솔 응용 프로그램에서이 메일 링 서비스를 사용하기 위해 지금하고자 다음과 같이 나는 바인딩 않습니다. 이렇게하기 위해서, 나는 단순히 http 컨텍스트를 가짜로 만들 수 있다고 생각하지만, 나는 이것으로 몇 시간 동안 고심하고있다. 컨텍스트에서

모든 메일 링 서비스 요구는이 두 가지 속성은 다음과 같습니다

  • httpContext.Request.UserHostAddress
  • httpContext.Request.RawUrl

나는 같은 것을 할 수 있다고 생각 그러나 :

가짜 요청 클래스 정의 :

이 밖으로 작동하지 않는 경우,

kernel.Bind<IUpDirEmailService>().To<UpDirEmailService>() 
     .WithConstructorArgument("httpContext", ninjectContext => new AutomatedTasksHttpContext()); 

을 불행하게도 :

public class AutomatedTasksHttpContext 
{ 
    public AutomatedTaskHttpRequest Request; 

    public AutomatedTasksHttpContext() 
    { 
     this.Request = new AutomatedTaskHttpRequest("", "", "", null, new StringWriter()); 
    } 
} 

을 내 콘솔 응용 프로그램에서 다음과 같이 바인딩 : 0

public class AutomatedTaskHttpRequest : SimpleWorkerRequest 
{ 
    public string UserHostAddress; 
    public string RawUrl; 

    public AutomatedTaskHttpRequest(string appVirtualDir, string appPhysicalDir, string page, string query, TextWriter output) 
     : base(appVirtualDir, appPhysicalDir, page, query, output) 
    { 
     this.UserHostAddress = "127.0.0.1"; 
     this.RawUrl = null; 
    } 
} 

내 자신의 상황에 맞는 클래스를 정의합니다. 나는 다양한 변종을 시도했지만 아무도 일하고 ​​있지 않았다. 나와 함께 견뎌주세요. IoC의 모든 것들은 나에게 새롭다.

답변

3

나는 콘솔 응용 프로그램과 똑같이 다른 접근 방식을 취하는 테스트를 위해 HttpContextFactory를 사용하는 것에 관해 최근에 대답했습니다. 이에 코드에서 다음

public static class HttpContextFactory 
    { 
     [ThreadStatic] 
     private static HttpContextBase _serviceHttpContext; 

     public static void SetHttpContext(HttpContextBase httpContextBase) 
     { 
      _serviceHttpContext = httpContextBase; 
     } 

     public static HttpContextBase GetHttpContext() 
     { 
      if (_serviceHttpContext!= null) 
      { 
       return _serviceHttpContext; 
      } 

      if (HttpContext.Current != null) 
      { 
       return new HttpContextWrapper(HttpContext.Current); 
      } 
      return null; 
     } 
    } 

:

이 테스트에서 다음
var rawUrl = HttpContextFactory.GetHttpContext().Request.RawUrl; 

는 솔기로 속성을 사용

HttpContextFactory.SetHttpContext(HttpMocks.HttpContext()); 

곳 HttpMocks에는 다음과 당신의 검사 결과에 따라 조정된다 :

public static HttpContextBase HttpContext() 
     { 
      var context = MockRepository.GenerateMock<HttpContextBase>(); 
      context.Stub(r => r.Request).Return(HttpRequest()); 
      // and stub out whatever else you need to, like session etc 
      return context; 
     } 


     public static HttpRequestBase HttpRequest() 
     { 
      var httpRequest = MockRepository.GenerateMock<HttpRequestBase>(); 
      httpRequest.Stub(r => r.UserHostAddress).Return("127.0.0.1"); 
      httpRequest.Stub(r => r.RawUrl).Return(null); 
      return httpRequest; 
     } 
+1

나는 모의가 시험용. 여기서는 내가 개발하고있는 테스트 장치는 아니지만 실제 콘솔 응용 프로그램입니다. 또한, Ninject와 함께 공장을 사용하는 방법을 잘 모르겠습니다. 실제 컨텍스트 대신 서비스 생성자에 전달할 컨텍스트 팩터 리입니까? –

관련 문제