2016-09-27 3 views
1

코드가이 문제를 내 가난한 제목보다 잘 설명한다고 생각합니다.동일한 객체를 두 번 스터 빙하면 RhinoMocks가 실패합니까?

_httpContextBaseHttpContextBase이지만 그 점은 상상할 수 없습니다. _httpCookiecollection 그냥 HttpCookieCollection

//Works fine 
_httpContextBase.Stub(c => c.Response.Cookies).Return(_httpCookieCollection); 

//Fails after attempting to stub the second line. "Object reference not set to an instance of an object". First line passes fine. 
_httpContextBase.Stub(c => c.Response.Cookies).Return(_httpCookieCollection); 
_httpContextBase.Stub(c => c.Request.Cookies).Return(_httpCookieCollection); 

//Work around 
var responseBaseMock = MockRepository.GenerateMock<HttpResponseBase>(); 
responseBaseMock.Stub(r => r.Cookies).Return(_httpCookieCollection); 
_httpContextBase.Stub(c => c.Response).Return(responseBaseMock); 

var requestBaseMock = MockRepository.GenerateMock<HttpRequestBase>(); 
requestBaseMock.Stub(r => r.Cookies).Return(_httpCookieCollection); 
_httpContextBase.Stub(c => c.Request).Return(requestBaseMock); 

가 위의 테스트는 각각 자신의 방법입니다 상상이다. 각 주석은 그 아래의 코드가 실행될 때 어떤 일이 발생하는지 설명합니다.

첫 번째 항목은 작동하고 두 번째 항목은 실패하고 세 번째 항목은 내 해결 방법입니다. 내가 알고 싶은 것은 왜 그것을 이해할 수없는 것처럼 두 번째 항목이 실패하는지입니다. 항목 2에 대한


스택 추적 (라인 1과 2가 반전되는 경우에도 동일한 스택 추적)

System.NullReferenceException : Object reference not set to an instance of an object. 
    at Api.Tests.Client.CookieTests.<>c.<Test>b__12_1(HttpContextBase c) in Api.Tests\Client\CookieTests.cs:line 113 
    at Rhino.Mocks.RhinoMocksExtensions.Expect[T,R](T mock, Function`2 action) 
    at Rhino.Mocks.RhinoMocksExtensions.Stub[T,R](T mock, Function`2 action) 
    at .Api.Tests.Client.CookieTests.Test() in .Api.Tests\Client\CookieTests.cs:line 113 
+0

이 질문에 Windsor를 사용하지는 않지만 대신 RhinoMocks를 사용하여 질문의 제목을 잘못 지정 했습니까? 또한 예외의 스택 추적을 포함하는 것이 좋습니다. –

+0

@JonathonRossi 오 ... 물론이었습니다. 고마워요 조나단! – Questioning

답변

0

나는 코드를 시도하지 않은, 그래서 잘되지 않을 수 있습니다. 그러나 _httpContextBase.Request가 null 일 수 있습니다. 이것이 사실이고 NullReferenceException의 원인 인 경우 _httpContextBase.Response가 null이 아닌 것처럼 보입니다. 동일한 문제가 없기 때문입니다.

개체가 테스트에서 설정되었는지는 모르겠지만 그 내용을 살펴볼 수 있습니다. 또한, 다른 방법으로 시도해 보셨습니까? 나는 그것이 요구와 관련이 있다는 것을 짐작할 것이다. 요청이 아니라 두 번째 분석이다.

당신이 요청하지 않았지만 HttpContext와 같은 복잡한 것을 조롱하는 데 유용한 다른 접근법을 제안 할 것입니다. 사용할 부분 (예 : ResponseCookies 및 RequestCookies)을 표시하는 추상화 인터페이스를 작성하십시오. 해당 인터페이스를 구현하면 HttpContext 멤버를 직접 사용할 수 있지만 다른 클래스는 더 이상 의존하지 않으며 조롱하거나 스텁 할 수있는 매우 간단한 인터페이스를 사용합니다.

+0

안녕하세요, 로빈, 답장을 보내 주셔서 감사합니다. 응답 및 요청은 모두 자체적으로 작동합니다. 첫 번째 "Works Works"항목을 가져 와서 Response to Request를 변경하면이 작업이 정상적으로 수행됩니다. 항목 2의 줄을 바꾸면 두 번째 줄에서 여전히 충돌합니다. 마지막 부분에 대한 아이디어 조언은 훌륭합니다! – Questioning