2014-06-16 7 views
1

특정 입력을 기반으로 상세한 파일을 빌드하는 기존 레거시 프로세스에 통합 테스트를 래핑하려면 파일의 전체 경로를 제공하여 동적으로 DLL을로드해야합니다.런타임시 C# .NET 통합 테스트의 내부에서 실제 경로를 찾는 방법은 무엇입니까?

이 테스트는 항상 동일한 물리적 응용 프로그램 디렉토리를 공유하지는 않지만 연속적 통합 프로세스를 통해 많은 서버에서 실행되며 때로는 응용 프로그램의 여러 인스턴스 동일한 실제 시스템에서 실행됩니다. 요점은 이 테스트에 하드 코드 할 때 사용할 수있는 표준 경로가 없음입니다. 필자가 실제로 필요로하는 것은 테스트가 실행되는 시점에 실제 경로가 실행되고 있다는 것을 알 수있는 메커니즘입니다. 그런 다음 상대 경로를 사용하여 응용 프로그램의 설치에서 DLL을 항상 안정적으로 찾을 수 있습니다.

테스트 중이므로 HttpContext.Current.Server.MapPath() 또는 Request.ApplicationPath와 같은 것에 의존 할 수 없습니다. 왜냐하면 Current는 테스트가 실행될 때 null이 될 것이기 때문입니다.

DLL을 배포하기 위해 해킹을 작성하지 않아요. 응용 프로그램을 빌드하고 실행할 수있는 드라이브 루트의 특수 폴더에 동적으로로드해야합니다. 실제 경로를 찾기 위해 .NET 전략을 잘 알고 있습니다. 런타임시 테스트?

그래서이 작업을 수행 할 필요가 간단한 테스트는 다음과 같이 것, 승인 시험 스타일의 주장과 함께, C#을 웹 응용 프로그램에서 NUnit를 사용하고 있습니다

[Test] 
public void ShouldGenerateFileConsistently() 
{ 
    string pathToDll = FindRelativePathToDllBasedOnPhysicalPath(); // <-- what I need to figure out 

    string generatedFileContents = OutputManager.GenerateReportUsingDynamicDll(pathToDll); 

    Approvals.Verify(generatedFileContents); 
} 
+0

것이 무엇 "마구 자르기"? DLL을 사용하는 응용 프로그램과 함께 DLL을 배포하는 옵션 인 경우 [DependencySharp] (https://github.com/evanwon/dependencysharp)에서 더 쉽게 관리 할 수 ​​있습니다. – TeaDrivenDev

+0

나는 아래 답변이 다른 질문에서 허용 된 대답보다 낫다고 주장하지만, 나는 속임수로 이것을 막았다. – spender

답변

2
var codebase = Assembly.GetExecutingAssembly().CodeBase; 
var pathUrlToDllDirectory = Path.GetDirectoryName(codebase); 
var pathToDllDirectory = new Uri(pathUrlToDllDirectory).LocalPath; 
+0

빠른 답장을 보내 주셔서 감사합니다! 알다시피, 내가 게시 한 직후, System.IO.Path를 사용하여 주위를 둘러 보려고 뭔가를 클릭했습니다. Path.GetFullPath (".")는 실제로 내가 찾고있는 것을 돌려 줄 것임을 깨달았습니다. 이는 예제가 반환하는 것과 정확히 일치하고 한 줄로 표시됩니다. 귀하의 대답은이 아이디어의 타당성을 입증하는 데 도움이됩니다. 경로가 마치 움직이는 것처럼 보입니다. 건배! – AR9