programing

moq를 사용한 모의 정적 속성

i4 2023. 8. 4. 22:38
반응형

moq를 사용한 모의 정적 속성

저는 moq를 사용하는 것이 꽤 생소합니다.나는 유닛 테스트 케이스를 만드는 것에 관심이 있습니다.HttpModule그리고 내가 그것을 칠 때까지 모든 것이 잘 작동합니다.static다음과 같은 재산

this.applicationPath = (HttpRuntime.AppDomainAppVirtualPath.Length > 1) ? HttpRuntime.AppDomainAppVirtualPath : String.Empty;

에 대한 조롱을 어떻게 만드는지 모르겠습니다.static같은 계급과 재산HttpRuntime.AppDomainAppVirtualPath.그context,request그리고.responsemoq에서 얻은 샘플 코드로 잘 조롱당했습니다.누군가 이것에 대해 도와준다면 감사하겠습니다.

Moq는 정적인 멤버를 속일 수 없습니다.

솔루션으로 정적 속성을 보유한 래퍼 클래스(어댑터 패턴)를 만들고 멤버를 위장할 수 있습니다.
예:

public class HttpRuntimeWrapper
{
    public virtual string AppDomainAppVirtualPath 
    { 
        get
        { 
            return HttpRuntime.AppDomainAppVirtualPath; 
        }
    }
}

생산 코드에서 이 클래스에 액세스할 수 있습니다.HttpRuntime그리고 이 재산을 위조합니다.

[Test]
public void AppDomainAppVirtualPathTest()
{
    var mock = new Moq.Mock<HttpRuntimeWrapper>();
    mock.Setup(fake => fake.AppDomainAppVirtualPath).Returns("FakedPath");

    Assert.AreEqual("FakedPath", mock.Object.AppDomainAppVirtualPath);
}

또 다른 솔루션은 정적 클래스 및 멤버를 위장할 수 있는 분리 프레임워크(Typemock Isolator)를 사용하는 것입니다.
예:

Isolate.WhenCalled(() => HttpRuntime.AppDomainAppVirtualPath)
       .WillReturn("FakedPath");

고지 사항 - Typemock에서 근무합니다.

Moq를 사용하여 정적 메서드를 Moq할 수 없습니다.

이것은 현실에서 나쁜 것이 아닙니다. 정적 방법과 클래스에는 그들의 자리가 있지만 논리적인 경우에는 단위 테스트를 어렵게 만듭니다.당연히 다른 도서관을 이용할 때 그들과 마주치게 될 것입니다.이 문제를 해결하려면 정적 코드 주위에 어댑터(랩퍼)를 작성하고 인터페이스를 제공해야 합니다.예:

// Your static class - hard to mock
class StaticClass
{
   public static int ReturnOne() 
   {
       return 1;
   }
}

// Interface that you'll use for a wrapper
interface IStatic
{
    int ReturnOne();
}

참고로 생산코드는 Istatic을 사용하는 구체적인 클래스는 생략했습니다.Istatic을 사용하는 클래스일 뿐이며 생산 코드는 이 클래스를 사용합니다.StaticClass위에.

그러면 Moq와 함께:

var staticMock = new Mock<IStatic>();
staticMock.Setup(s => s.ReturnOne()).Returns(2);

이전 답변에서 언급했듯이 정적 메서드에 MoQ를 사용할 수 없으며, 필요한 경우 정적 클래스 주변에 래퍼를 만드는 것이 최선입니다.

하지만 최근에 발견한 것은 Moles 프로젝트입니다.홈 페이지에서 "몰은 아무 것이나 교체할 수 있습니다.대리자가 있는 NET 메서드입니다.Moles는 정적 또는 비가상 방법을 지원합니다."그것은 당신의 현재 상황에 유용할 수 있습니다.

내가 지금까지 찾은 최고의 해결책은 텔레릭의 저스트모크입니다. 불행히도 유료 버전만이 통계를 조롱할 수 있습니다.

통계를 포장하는 아이디어는 좋은 아이디어이지만 항상 이렇게 할 수는 없습니다.일부 정적 클래스를 이미 사용하는 일부 코드를 테스트하려는 경우 항상 래퍼를 사용하여 전환할 수는 없습니다.이 경우 JustMock은 합리적인 솔루션으로 보이며 조만간 일부 솔루션에 사용할 예정입니다.

마이크로소프트 페이크를 사용할 수 있습니다.그것은 분명히 문제를 해결할 것입니다.https://msdn.microsoft.com/en-us/library/hh549175.aspx 를 참조하십시오.

@Sujith가 제안한 Microsoft Fake를 사용하는 은 실행 가능한 해결책입니다.다음은 실제로 수행하는 방법입니다.

  • » System.Web 오른쪽 를 클릭합니다.
  • "추가"를 선택합니다. 하면 참조가 됩니다.System.Web.4.0.0.0.Fakes
  • 다음 코드를 사용합니다.

    (Microsoft)를 사용합니다.퀄리티도구, 테스트.가짜. 심스컨텍스트.() {시스템을 만듭니다.거미줄. 가짜.ShimHttp 런타임.AppDomainAppVirtualPathGet =() => "/", // 가짜 AppDomainAppVirtualPath}이(가) 필요한 모든 작업 수행

언급URL : https://stackoverflow.com/questions/2416362/mock-static-property-with-moq

반응형