2008-10-23 2 views
7

저는 ASP.NET MVC에서 UserViewControl의 단위 테스트를 작성하는 동안 잠시 노력해 왔습니다. 다음과 같은 코드를 작성하고 싶습니다.어떻게 MVC UserViewControl을 단위 테스트 할 수 있습니까?

[TestMethod] 
public void HaveControlToDisplayThings() 
{ 
    var listControl = new ControlUnderTest(); 
    var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData()); 

    // Set up a ViewContext using Moq. 
    listControl.SetFakeViewContext(viewData); 
    listControl.ViewData = viewData; 
    listControl.RenderView(listControl.ViewContext); 

    // Never got this far, no idea if this will work :) 
    string s = listControl.ViewContext.HttpContext.Response.Output.ToString(); 
    Assert.AreNotEqual(0, s.Length); 
    foreach (var item in this.repo.GetMeSomeData()) 
    { 
     Assert.IsTrue(s.IndexOf(item) != -1); 
    } 
} 

불행히도 내가 뭘 하려는지에 관계없이 RenderView 내부에서 오류가 발생합니다. 이것은 정적 인 HttpContext.Current 객체에 의해 (내가 말할 수있는 한) 쓸모가 없습니다. NullReferenceExceptionSystem.Web.UI.Page.SetIntrinsics에서 얻습니다.

나는 필 Haack의 HttpSimulator 나에게 HttpContext 개체를 준하지만 난 또한 조금 더 얻기 위해 가짜 HttpBrowserCapabilities 개체를 지정하는 데 필요한 발견하여 시도 :

Subtext.TestLibrary.HttpSimulator simulator = new HttpSimulator(); 
simulator.SimulateRequest(); 
var browserMock = new Mock<HttpBrowserCapabilities>(); 
browserMock.Expect(b => b.PreferredRenderingMime).Returns("text/html"); 
browserMock.Expect(b => b.PreferredResponseEncoding).Returns("UTF-8"); 
browserMock.Expect(b => b.PreferredRequestEncoding).Returns("UTF-8"); 
HttpContext.Current.Request.Browser = browserMock.Object; 

가 지금은 재산에 예외를 얻을 해당 개체에 액세스 . 내가 할 수있는 한 많은 것을 조롱했지만 아무데도 빨리 가지 않는 것처럼 보였다.

누구든지이 작품을 만들 수 있습니까?

+0

저는 오래전에 단위 테스트를 포기했습니다. 가지고있는 비즈니스 로직을 컨트롤러로 옮기고 그 대신 단위 테스트를 해보십시오. 뷰는 단위 테스트를 위해 복잡하게 악명이 높습니다. 실제 답변이있을 수 있지만, 우리 의견이 너무 빨리 발전하기 때문에 얼마 전 포기했습니다. – CVertex

+0

그래, 일반적으로 내 견해를 테스트하고 싶지 않지만 사용자 컨트롤을 사용할 때 이것은 앱 전체에서 자주 사용되며 말하는 컨트롤러 코드가없는 재사용 가능한 부분입니다. 인스턴스화하고 렌더링 할 수 있으며 대략적인 내용이 포함되어 있는지 테스트하고 싶습니다. –

+0

내가 아는 한 실제로 repo.GetMeSomeData()보기 또는 사용자 컨트롤에 조금 의존하지 않는 테스트하고 있습니다. repo.GetMeSomeData()가 원하는 것을 제공하고 컨트롤을 호출하지 않는지 여부를 확인할 수 있습니까? – Graviton

답변

3

ASP.NET 뷰어 엔진은 ASP.NET 호스팅 환경에서 VirtualPathProvider를 사용합니다. 설상가상으로 Reflector를 사용하여 다른 코드를 추적 한 결과 VirtualPath 유틸리티에 대한 일부 하드 코드 참조에 다른 종속성이 있다는 것을 발견했습니다. 릴리스에서이 문제를 수정하여 뷰를 실제로 테스트하고 렌더링 방법을 테스트 할 수 있기를 바랍니다.

+0

기본적으로 다음과 같기 때문에 이것을 대답으로 받아들입니다. 아니요, 뷰를 렌더링 한 결과를 ** 단위 테스트 ** 할 방법이 없습니다. 셀레늄을 사용하면 Watin 또는 이와 동등한 것이 좋은 대안이지만 브라우저/컨트롤/뷰 출력 테스트를 통해 내가 실제로하고 싶은 것은 아닙니다. –

2

하나의 옵션은 브라우저 내에서 단위 테스트를 실행하는 것입니다. 그런 경우에 Selenium으로 성공했습니다.

2

단위 테스트보기를 포기하고 현재 빌드의 일부로 WatiN 브라우저 테스트를 사용 중입니다.

또한 Resharper Solution Wide Analysis을 사용하여 컴파일러 오류가 있는지 확인합니다. 완벽하지는 않지만 비슷한 결과를 얻습니다. 단점 - WatiN 테스트가 느립니다.

1

asp.net webforms 사이트를 실행하기 위해 HttpBrowserCapabilities 개체에서 설정해야하는 값입니다. 이러한 값이 설정되어 있는지 확인하고 문제가 해결되는지 확인합니다. 그럴만 한 가치가 있겠습니까? (예 : 1.0)

  • w3cdomversion (참/거짓)
  • 버전
  • 테이블 (브라우저 예를 들어 1.0 버전) (이름 일명) (요청에 전달 된)
  • 사용자 에이전트

    • 브라우저
    • 쿠키 (참/거짓)
    • ecmascriptversion (예 : 1.0)

    희망이 도움이됩니다.

  • +0

    감사합니다. 다음 번에이 코드를 작성하려고합니다. –

    1

    UI 테스트를 위해 selenium도 권장합니다. 단위 테스트를 할 수있는 표준 MVC 애플리케이션에는 꽤 많이 있지만 UI 레벨 구성 요소는 항상 Selenium과 같은 브라우저 내 테스트에 더 적합하다고 보입니다. cruisecontrol.net을 사용하여 Selenium 테스트를 유닛 테스트와 통합 할 수 있습니다.

    여기에 셀렌과 CC.Net을 통합하기위한 guide이 있습니다.

    1

    TypeMock을 사용하여 종속성을 조롱합니다. 컨트롤러 레이어에서 요청 및 응답 종속성을 조롱하는 방법에 대해 one blog post을 작성했습니다. 어쩌면 도움이 될지도 모른다.

    관련 문제