Reg.AutoFixture를 사용하여 Html 도우미 단위 테스트
-
29-10-2019 - |
문제
원래 질문 : AutoFixture로 Html 도우미 단위 테스트
원래 질문을 다시 열어야할지 모르겠습니다. 그러나 원래 질문을 해결 된 것으로 표시했기 때문에 새 질문을 만들기로 결정했습니다. 내가 잘못했다면 사과드립니다.
Mark가 제안한 접근 방식을 사용하고 있었지만 Freeze를 사용하는 동안 문제가 발생했습니다.
아래는 완전한 소스 코드입니다… 테스트중인 클래스 : 라코 디스
단위 테스트는 HttpContext 내의 지정된 키에 대해 예상대로 반환 된 Html을 확인하는 것입니다. 라코 디스
아래와 같이 Fixture를 구성했습니다. 라코 디스
그런 다음 ViewContext에서 고정 : 라코 디스
아래 예외가 발생합니다. <인용구>
오류 1 테스트
'MvcDemo2.Tests.Controllers.SampleHelpersTestsAutoFixture.SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml'
실패 : System.Reflection.TargetInvocationException : 예외가 있습니다.
호출 대상에 의해 던져졌습니다.
---- System.NotImplementedException : 메서드 또는 작업이
구현되었습니다. ...에서
System.RuntimeMethodHandle._InvokeMethodFast (IRuntimeMethodInfo
메서드, 개체 대상, 개체 [] 인수, SignatureStruct & sig,
MethodAttributes methodAttributes, RuntimeType typeOwner) at
System.RuntimeMethodHandle.InvokeMethodFast (IRuntimeMethodInfo 메서드,
개체 대상, 개체 [] 인수, 서명 시그니처, MethodAttributes
methodAttributes, RuntimeType typeOwner)
System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags
invokeAttr, 바인더 바인더, Object [] 매개 변수, CultureInfo 문화,
부울 skipVisibilityChecks)
System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags
invokeAttr, 바인더 바인더, Object [] 매개 변수, CultureInfo 문화)
System.Reflection.RuntimePropertyInfo.SetValue (Object obj, Object
value, BindingFlags invokeAttr, 바인더 바인더, Object [] 인덱스,
CultureInfo 문화)
System.Reflection.RuntimePropertyInfo.SetValue (Object obj, Object
값, 개체 [] 인덱스)
Ploeh.AutoFixture.Kernel.AutoPropertiesCommand1.Execute(T specimen,
ISpecimenContext context) at
Ploeh.AutoFixture.Kernel.Postprocessor
1.Create (개체 요청,
ISpecimenContext 컨텍스트)
Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder. <> c__DisplayClass6.b__1 (ISpecimenBuilder
b) System.Linq.Enumerable.WhereSelectListIterator2.MoveNext()
2.MoveNext ()
at System.Linq.Enumerable.WhereSelectEnumerableIterator
System.Linq.Enumerable.d__a51.MoveNext()
1에서
출처)
Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create (Object
요청, ISpecimenContext 컨텍스트)
Ploeh.AutoFixture.Kernel.RecursionGuard.Create (개체 요청,
ISpecimenContext 컨텍스트)
Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve (Object request) at
Ploeh.AutoFixture.Kernel.SeedIgnoringRelay.Create (개체 요청,
ISpecimenContext 컨텍스트)
Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder. <> c__DisplayClass6.b__1 (ISpecimenBuilder
b) System.Linq.Enumerable.WhereSelectListIterator
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable2.MoveNext()
2.MoveNext ()
at System.Linq.Enumerable.WhereSelectEnumerableIterator
System.Linq.Enumerable.d__a51.MoveNext()
1에서
출처)
Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create (Object
요청, ISpecimenContext 컨텍스트)
Ploeh.AutoFixture.Kernel.Postprocessor
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1.Create(Object request,
ISpecimenContext context) at
Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.<>c__DisplayClass6.<Create>b__1(ISpecimenBuilder
b) at System.Linq.Enumerable.WhereSelectListIterator
2.MoveNext ()
System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
1.MoveNext ()
at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a5
에서
System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable1
source) at
Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object
request, ISpecimenContext context) at
Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request,
ISpecimenContext context) at
Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) at
Ploeh.AutoFixture.SpecimenFactory.CreateAnonymous[T](ISpecimenContext
context, T seed) at
Ploeh.AutoFixture.SpecimenFactory.CreateAnonymous[T](ISpecimenBuilderComposer
composer, T seed) at
Ploeh.AutoFixture.FixtureFreezer.Freeze[T](IFixture fixture, T seed)
2 범위,
HttpContextBase httpContext)에서
System.Web.Mvc.ViewContext.SetClientValidationEnabled (부울 활성화,
IDictionary`2 범위, HttpContextBase httpContext)
System.Web.Mvc.ViewContext.set_ClientValidationEnabled (부울
값) C : \ Users ... 78
at
MvcDemo2.Tests.Controllers.SampleHelpersTestsAutoFixture.SampleTableHtmlHelper_WhenKeyExistWithinHttpContext_ReturnsExpectedHtml()
in C:\Users\...:line 78
----- Inner Stack Trace ----- at
System.Web.HttpContextBase.get_Items() at
System.Web.Mvc.ViewContext.ScopeCache.Get(IDictionary
p의 값을 설정하려고 할 때 실패한 것 같습니다.
특성 ViewContext.Set ClientValidationEnabled.이 문제에 갇혀 있습니다.어떤 생각이라도 대단히 감사합니다.
해결책
글쎄, 내부 스택 추적을 고려하면 예외가 HttpContextBase.Items
에 의해 발생하고 있음을 알 수 있습니다.리플렉션 도구를 사용하여 구현을 살펴보면이 가상 메서드가 NotImplementedException을 throw한다는 것을 알 수 있습니다. POLA 위반에 대해 이야기하십시오.BCL의 많은 웹 추상화가 정확히 그렇게하는데, 처리하기 정말 정말 고통 스럽습니다.
더 이상 도움이 될지 모르겠지만 다음과 같이 ViewContext 클래스의 AutoProperties를 해제하면이 특정 문제를 해결할 수 있습니다. 라코 디스
다른 팁
마크에게 감사합니다. AutoFixture가 매우 유용하다고 생각하지만 단위 테스트 MVC에서는 API를 적용하는 것이 조금 더 까다 롭습니다. 아직 API를 처음 접했기 때문일 수 있습니다.
함께…. 라코 디스
위의 내용은 잘 작동하지만 항목을 추가하려고 할 때 다시 실패한다고 생각 하셨겠지만 라코 디스 <인용구>
예외 : 방법 또는 작업이 구현되지 않았습니다.
HttpContextBase의 리플렉터 ... 라코 디스
그래서 내가 생각할 수있는 유일한 방법은 나만의 HttpContextBase 구현을 만드는 것입니다 라코 디스
다음은 혼란스러운 부분입니다 .. 라코 디스
이 두 줄을 바꾸면 (먼저 anonymouse 인스턴스를 만든 다음 가짜 인스턴스를 삽입하는) 오류가 발생합니다. <인용구>
AutoFixture는 다음에서 인스턴스를 만들 수 없습니다. System.Web.HttpContextBase, 공용이 없기 때문일 가능성이 높습니다. 생성자.
지금까지 이런 테스트를 생각해 볼 수 있습니다 ... 라코 디스
또한 새로운 AutoMoqCustomization ()이 테스트에 영향을 미치지 않는 것으로 보이므로 제거했습니다. AutoFixture에 익숙해지면 더 나은 버전을 찾을 수있을 것입니다. 도와 주셔서 감사합니다.