문제

원래 질문 : 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.Postprocessor1.Create (개체 요청, ISpecimenContext 컨텍스트) Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder. <> c__DisplayClass6.b__1 (ISpecimenBuilder b) System.Linq.Enumerable.WhereSelectListIterator2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext ()
System.Linq.Enumerable.d__a51.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
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.WhereSelectListIterator2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext ()
System.Linq.Enumerable.d__a51.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1에서 출처) Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create (Object 요청, ISpecimenContext 컨텍스트) Ploeh.AutoFixture.Kernel.Postprocessor1.Create(Object request, ISpecimenContext context) at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.<>c__DisplayClass6.<Create>b__1(ISpecimenBuilder b) at System.Linq.Enumerable.WhereSelectListIterator2.MoveNext ()
System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.<DefaultIfEmptyIterator>d__a5
1.MoveNext ()
에서 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)
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
2 범위, HttpContextBase httpContext)에서 System.Web.Mvc.ViewContext.SetClientValidationEnabled (부울 활성화, IDictionary`2 범위, HttpContextBase httpContext) System.Web.Mvc.ViewContext.set_ClientValidationEnabled (부울 값) C : \ Users ... 78

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에 익숙해지면 더 나은 버전을 찾을 수있을 것입니다. 도와 주셔서 감사합니다.

<인용구>

ViewContext.SetClientValidationEnabled 속성 값을 설정하려고 할 때 실패한 것 같습니다.

이 문제는 이 답변으로 해결되었습니다. 그가 HtmlHelper를 얻는 방법을 확인하세요 ( 여기 ).

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