私はしばらくの間、ASP.NET 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 オブジェクトが役に立たないことが原因です - I get NullReferenceException
s from System.Web.UI.Page.SetIntrinsics
.
Phil Haack のHttpSimulatorHttpBrowserCapabilities
を使用して HttpContext オブジェクトを取得しようとしましたが、さらに少し進めるには偽のオブジェクトを指定する必要があることもわかりました。
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;
これで、そのオブジェクトのプロパティ アクセスで例外が発生します。私はできる限り多くの人を嘲笑しましたが、どこにも速くなっていないようでした.
誰かがこれを機能させることができましたか?