문제

우선, 나는이 질문이 위험하다는 것을 알고 있습니다.C#에서 단위 테스트에서 Mappath를하는 방법

그러나 나는 그것이 다른 해결책을 가지고 있기를 바라고 있습니다. 내 문제는 다음과 같습니다.

내 코드에는 검증해야 할 객체가 있습니다. 각 유효성 검사 방법에 대한 단위 테스트를 작성하여 올바르게 검증되고 있는지 확인하고 있습니다. 모의 데이터를 생성하고 객체에로드 한 다음 검증하고 있습니다. 문제는 유효성 검사 내에서 오류가 발생하면 오류 코드가 할당된다는 것입니다. 이 오류 코드는 Server.Mappath를 사용하여 XML 파일의 오류에 대한 정보를 수집하는 데 사용됩니다. 그러나 XML 파일을 얻으려고 할 때는 파일을 찾을 수없는 예외가 발생합니다.

Mappath가 내 유효성 검사 코드에 있으므로 단위 테스트가 아니기 때문에 경로를 인식하기 위해 단위 테스트를 어떻게 얻습니까? 이 질문이 의미가 있습니까?

오류 줄 (내 유효성 검사 코드에서 단위 테스트) :

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

단순화 : 단위 테스트는 내 프로그램에서 Server.mappath를 호출하는 메소드를 호출하여 실패합니다.

도움이 되었습니까?

해결책

"파일 이름 제공 업체"를 단순히 위치를 반환하는 클래스로 추상화 한 다음 훨씬 쉽게 조롱 할 수 있습니다.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

그런 다음 PathProvider 클래스를 직접 사용할 수 있습니다 ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

또는 테스트에서 조롱하십시오.

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

다른 팁

엄격한 인터넷 검색과 동료의 도움을받은 후 우리는 이미 .NET에 이미 내장 된 간단한 솔루션을 생각해 냈습니다.

유효성 검사 프로세스에 액세스하는 단위 테스트보다 다음과 같이 덧붙였습니다.

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

이것은 완벽하게 작동합니다. 기본적으로 테스트가 호출되면 페이지로드에 지정된 단위 테스트로 URL을로드합니다. 현재 단위 테스트를 호출하는 웹 사이트이므로 유효성 검사는 Server.mappath에 액세스 할 수 있습니다. 이 솔루션은 모든 사람에게 효과가 없지만 이에 완벽했습니다. 당신이 기여한 모든 것에 감사드립니다.

Rhino Mocks 또는 대체 조롱 프레임 워크를 사용하여 HTTPContext (또는 다른 종속 객체)를 조롱하거나 자신의 모의 개체를 작성할 수 있습니다. 또는 실제 환경의 MappathWrapperBase 클래스에서 상속 된 MappathWrapper 클래스를 작성한 다음 장치 테스트를 위해 MockMappathWrapper 개체를 만듭니다.

SO를 조롱하기위한 많은 예가 있어야합니다.

다음은 다음과 같습니다.

Rhino Mocks를 사용하여 httpcontext.application을 조롱하는 방법

업데이트ASP.NET MVC에서는이 작업을 수행 한 경험이 있습니다. WebForms I ImageIn은 HTTPContextBase 클래스가 없기 때문에 훨씬 더 어려울 것입니다.

나는 당신의 종속성을 인수로 받아들이는 방법을 추출합니다.

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

그런 다음 다양한 방법을 독립적으로 테스트 할 수 있습니다. 예를 들어, 방법을 테스트합니다 ValidatePath() 누락 된 파일을 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top