2011-07-04 4 views
1

배경 : 데이터베이스가있는 ASP.NET MVC3 앱이 있습니다. 나 또한 (다른 것들 중에서) 웹 애플 리케이션의 데이터베이스를 초기화하는 복잡한 콘솔 응용 프로그램을 가지고 있습니다 : 생성, 제약 조건 추가, sprocs 추가, 트리거, 시드 추가 등등. 나는 웹 응용 프로그램으로 콘솔 논리를 옮길 수 없다. 우리 아키텍처에서의 감각).호스팅 환경 외부에서 ASP.NET MVC 경로에 액세스하십시오.

문제 : 콘솔 응용 프로그램 분명히 그렇게 HostingEnvironment에 접근, MapPath, HttpContext.Current, Server.MapPath, ~ 등을하지만이에서 웹 응용 프로그램의 경로에 대한 액세스를 필요로하지 않는다, 호스팅 된 환경에서 실행되지 않습니다 콘솔 앱. 또한 콘솔 응용 프로그램은 웹 응용 프로그램을 호출합니다. 웹 응용 프로그램은 이러한 클래스를 정상적으로 사용하지만 물론 모두 null이거나 정의되지 않습니다.

질문 : 내가 호스팅 환경의 경로 메커니즘에 액세스 할 수 있도록 이러한 클래스 중 하나를 스푸핑 할 수있는 방법이 실행되지에도 불구하고 있는가?

콘솔 앱에 필요한 모든 경로를 하드 코딩 할 수 있지만 매우 바람직하지 않습니다.

단위 테스트에 동일한 필요성이 필요하기 때문에 가능해야한다는 인상하에 있습니다.

TIA

+0

"콘솔 앱에서 웹 앱의 경로에 액세스해야합니다."- 정확히 무엇을 의미합니까? 어떤 길과 이유? – bzlm

+0

@bzlm : 웹 응용 프로그램의 루트 경로 (~), 이미지 디렉토리, db 디렉토리 (둘 이상), 임시 디렉토리, 다양한 csv 저장소, 클라이언트 파일 등 ... 콘솔 앱은 다양한 백엔드 시스템의 데이터를 가져 와서 고정시킵니다. 찾을 수있는 웹 시스템의 올바른 위치에 있어야합니다. 이 작업을 깔끔하게하려면 웹 응용 프로그램에서 사용하는 경로에 액세스해야합니다. 그렇지 않으면 모든 것을 하드 코딩해야하며 몇 개의 하위 시스템이 호출되어 문제가 발생할 것입니다. – Matt0

답변

0

MOQ는 당신이 필요로하는 MVC3 컨텍스트를 조롱에 좋은 곳입니다. 설치가 매우 쉽고 웹 컨텍스트에서 일반적으로 실행되는 메서드와 속성을 재정 의하여 원하는 개체를 반환 할 수 있습니다.

How do I mock the HttpContext in ASP.NET MVC using Moq?

MVC 3 Unit Test - Get Actual Response Data

http://www.sharpedgesoftware.com/Blog/2011/03/14/mocking-a-controllercontext-with-authenticated-user-with-moq-for-aspnet-mvc-3

http://code.google.com/p/moq/

+0

몇 가지 자료를 읽으십시오. 아마도 작동 할 지 모르지만 그런 간단한 작업에는 복잡하게 복잡해 보입니다 ... 그리고 우리가 다른 용도로 사용하지 않을 종속성을 소개합니다. – Matt0

+0

@ Matt0, 조롱을 사용하여 심각하게 술취한 건축물처럼 느껴진다. 콘솔 응용 프로그램이 사용할 수없는 항목에 의존하는 경우 실제로 실행되도록 코드를 얻는 것을 제외하고는 해당 내용을 조롱하는 것이 무의미합니다. – bzlm

+0

@bzlm : 동의했는데 어떻게 도움이 될지 모르겠다 – Matt0

1

작은 웹 서비스를 기록하고에서 원하는 데이터를 노출 :

오히려 더 설명하지는 않고, 여기에서 시작하십시오 웹 애플 리케이션, 그럼 그냥 콘솔에서 전화 e 앱

+0

아마도 웹 응용 프로그램이 실행되고 있어야합니다. 단지 어셈블리를 참조 할 수는 없습니다. – Matt0

+0

@ Matt0 - HttpContext.Current와 같은 항목의 경우 웹 응용 프로그램을 실행해야하지 않습니까? 어셈블리에서 현재 HttpContext를 가져올 수 없습니다. 이것은 런타임 값입니다. – JeremyDWill

+0

@JeremyDWill 사실, 그렇기 때문에 나는 그것에 접근 할 필요가 없다. 원하는 것은 경로 메커니즘뿐입니다. HttpContext가 아닌 여러 클래스에서 가져올 수 있습니다. 하지만 그렇게되면 모든 수업을 사용할 수 없게됩니다. – Matt0

0

StructureMap (또는 다른 IoC 프레임 워크)을 사용해보세요. 현재 작업중인 프로젝트에서 웹 사이트의 HttpContext.Current 개체에 HttpContextBase을 연결했습니다. 이렇게하면 어떤 환경에서도 HttpContext 기능을 사용할 수 있습니다.

단위 테스트의 경우 HttpContextBase에서 오버레이 한 스텁/모의 객체를 사용하고 있습니다. 사용하고자하는 대부분의 객체에는 배선을 설정하는 데 사용할 수있는 인터페이스 또는 기본 클래스가 있습니다. .NET Framework 조롱을 위해 Pex & Moles을 사용해 볼 수 있습니다. 그렇게 할 수 있어야합니다. 그렇게 말하면됩니다. 나 자신을 사용하지 않은,하지만 그것은 꽤 깔끔하게 보인다!

0

이 중 일부는 주위에 떠있었습니다. 대부분의 경우 실제로 1 또는 2 개의 구성 값이 필요합니다. 그런 다음 경로를 매우 효과적으로 계산할 수 있습니다. 가치 # 1은 웹 응용 프로그램의 루트입니다. 거기에서 모든 리소스에 대한 URL을 쉽게 만들 수 있습니다. 값 2는 웹 앱의 실제 위치가 실제 상황에서 중요 할 경우 해당 위치입니다.(나는 정말 그것을 좋아한다하지만) 내가 무슨 짓을했는지

1

:

대신 웹 응용 프로그램의 주위에 다양한 경로를 산란, 우리는 모든 주요 자원에 대한 private static readonly 문자열을 포함하는 단일 정적 Paths 클래스를 가지고 경로 (T4MVC가 우리에게 도움이되지 않는 경로). 어떤 경로가 필요할 때마다 그 클래스에 요청하고 필요한 문자열을 Path.Combine() 등의 문자열에서 수행합니다. 결과적으로 모든 하드 코딩 된 문자열은 깨끗하고 유지하기 쉬운 클래스에 존재합니다.

그래서이 클래스에 속성 public static string ApplicationRootPath { get; } (공개 및 읽기 전용이 있음)을 추가하고 사용 사례에 따라 ApplicationRootPath = HostingEnvironment.MapPath("~"); 또는 "/"으로 초기화하는 정적 생성자를 추가했습니다.

콘솔 앱에서 "루트"디렉토리를 Paths.ApplicationRootPath = "some absolute or relative path here";으로 덮어 쓸 수 있습니다. 이 한 줄을 입력하면 웹 앱의 모든 경로에 액세스 할 수 있습니다.

사실 꽤 깔끔하지만 여전히 이상적은 아닙니다. 나는 누군가가 더 좋은 생각을 가지고 있지 않으면 이것을 대답으로 받아 들일 것이다.

관련 문제