저는 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 객체에 의해 (내가 말할 수있는 한) 쓸모가 없습니다. NullReferenceException
을 System.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;
가 지금은 재산에 예외를 얻을 해당 개체에 액세스 . 내가 할 수있는 한 많은 것을 조롱했지만 아무데도 빨리 가지 않는 것처럼 보였다.
누구든지이 작품을 만들 수 있습니까?
저는 오래전에 단위 테스트를 포기했습니다. 가지고있는 비즈니스 로직을 컨트롤러로 옮기고 그 대신 단위 테스트를 해보십시오. 뷰는 단위 테스트를 위해 복잡하게 악명이 높습니다. 실제 답변이있을 수 있지만, 우리 의견이 너무 빨리 발전하기 때문에 얼마 전 포기했습니다. – CVertex
그래, 일반적으로 내 견해를 테스트하고 싶지 않지만 사용자 컨트롤을 사용할 때 이것은 앱 전체에서 자주 사용되며 말하는 컨트롤러 코드가없는 재사용 가능한 부분입니다. 인스턴스화하고 렌더링 할 수 있으며 대략적인 내용이 포함되어 있는지 테스트하고 싶습니다. –
내가 아는 한 실제로 repo.GetMeSomeData()보기 또는 사용자 컨트롤에 조금 의존하지 않는 테스트하고 있습니다. repo.GetMeSomeData()가 원하는 것을 제공하고 컨트롤을 호출하지 않는지 여부를 확인할 수 있습니까? – Graviton