私は現在ユニットテストのためにScott Hanselmans HTTP context mockを使用していました。これはMVC 3でうまくいきました。私は次のコードの呼び出しをテストするために使っていました。私が最初に私が問題に遭遇したMVC 4に私のアプリを変換する場合MVC 4 Mocking HttpContext - 模擬する方法DisplayModeProvider
public class PartialViewRenderer : IPartialViewRenderer
{
public string Render(Controller controller, string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View,
controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
}
、それは実行時例外を得ていました。だから私はHanselmans MockHelpersで次のメソッドを変更する上で私を上陸され、通過して、定着に必要なものを固定してみました:(それは「ヌル」の例外を吹いていたので、私は基本的にHttpContext.Itemsが返さ取得するように変更)
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
var cookies = new HttpCookieCollection();
var items = new ListDictionary();
request.Setup(r => r.Cookies).Returns(cookies);
response.Setup(r => r.Cookies).Returns(cookies);
context.Setup(ctx => ctx.Items).Returns(items);
context.SetupGet(ctx => ctx.Request).Returns(request.Object);
context.SetupGet(ctx => ctx.Response).Returns(response.Object);
context.SetupGet(ctx => ctx.Session).Returns(session.Object);
context.SetupGet(ctx => ctx.Server).Returns(server.Object);
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller, RouteData route)
{
var httpContext = FakeHttpContext();
ControllerContext context = new ControllerContext(new RequestContext(httpContext, route), controller);
controller.ControllerContext = context;
}
ここで
私が試してみて、私はこのテストを実行したときに(私もまだアサートに入れhaventは)HTTPコンテキストのこのモックに今
[Test]
public void test()
{
_contactsController = _container.Resolve<ContactsController>();
var route = new RouteData();
route.Values.Add("controller", "ContactsController");
route.Values.Add("action", "GetEditContactDetailsDialog");
_contactsController.SetFakeControllerContext(route);
var result = _contactsController.GetEditContactDetailsDialog("1");
}
を行う必要がある変更内容見極める必要があり、非常に単純なNUnitのテストこれはPartialViewRenderer.RenderコールのViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
行で呼び出されます。次のスタックトレースがあります。
at System.WebPages.DisplayModeProvider。 < .ctor> b__2(HttpContextBaseコンテキスト)at System.Web.WebPages.DefaultDisplayMode.CanHandleContext(HttpContextBase httpContext) at System.WebPages.DisplayModeProvider。 <> c__DisplayClass6.b__5(IDisplayModeモード)System.Linq.Enumerable.WhereListIterator
1.MoveNext() at System.Collections.Generic.List
1..ctorで (IEnumerableを1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1ソース)System.Web.WebPages.DisplayModeProvider.GetAvailableDisplayModesForContext(HttpContextBaseのHttpContext、IDisplayMode currentDisplayMode) におけるシステムで.Web.Mvc.VirtualPathProviderViewEngine.GetPath(controllerContext controllerContext、文字列[]位置、文字列[] areaLocations、ストリングlocationsPropertyName、文字列名、ストリングコントローラ名、文字列cacheKeyPrefix、ブールuseCache、文字列[] & searchedLocations)
それ私はそこに入り、DisplayModeProviderをモックすることはできないようです。 Per the MVC source Code誰にもこれに対する解決策がありますか?私はどこにでもこのソリューションを見つけることはできませんでした。
私はDisplayModeのモックに関する似たような問題を抱えています。私はあなたが何か解決策を見つけることができたのだろうか? – Shahin