moq를 사용한 모의 정적 속성
저는 moq를 사용하는 것이 꽤 생소합니다.나는 유닛 테스트 케이스를 만드는 것에 관심이 있습니다.HttpModule
그리고 내가 그것을 칠 때까지 모든 것이 잘 작동합니다.static
다음과 같은 재산
this.applicationPath = (HttpRuntime.AppDomainAppVirtualPath.Length > 1) ? HttpRuntime.AppDomainAppVirtualPath : String.Empty;
에 대한 조롱을 어떻게 만드는지 모르겠습니다.static
같은 계급과 재산HttpRuntime.AppDomainAppVirtualPath
.그context
,request
그리고.response
moq에서 얻은 샘플 코드로 잘 조롱당했습니다.누군가 이것에 대해 도와준다면 감사하겠습니다.
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
'programing' 카테고리의 다른 글
NIB 파일의 개체를 앞/뒤로 보내는 방법은 무엇입니까? (0) | 2023.08.04 |
---|---|
데이터 정렬 충돌을 해결할 수 없음 (0) | 2023.08.04 |
angular2 rc.5 사용자 지정 입력, 지정되지 않은 이름을 가진 양식 제어를 위한 값 접근자 없음 (0) | 2023.08.04 |
해시 테이블을 키-값 쌍으로 열거하거나 키 값 집합으로 해시 테이블을 필터링하는 방법 (0) | 2023.08.04 |
HTML에서 구성 요소의 정적 변수를 각도 2에서 바인딩하는 방법은 무엇입니까? (0) | 2023.08.04 |