经过测试的菜鸟,所以请耐心等待,
我有一个控制器,它返回一个JsonResult,其中包含由Url.Action计算的字符串,如下所示:
public ActionResult GetResult(SomeModel model)
{
if (ModelState.IsValid)
{
return Json(new { redirectTo = Url.Action("Index", "Profile") });
}
}
当我使用jQuery使用该结果时,应用程序工作正常。
然而,在我的单元测试期间,我遇到了问题,因为当我测试Json字符串的内容时,redirectTo值似乎是“null”,即使它在应用程序本身中不为null。
我的测试方法看起来有点像这样:
[Test]
public void GetResult_Success()
{
var result = controller.GetResult(new SomeModel());
Assert.IsNotNull(result);
Assert.IsInstanceOf<JsonResult>(result);
var jsonResult = result as JsonResult;
var jsonObject = JsonConvert.DeserializeAnonymousType(new JavaScriptSerializer().Serialize(jsonResult.Data), new
{
redirectTo = string.Empty
});
Assert.AreEqual("Profile/Index", jsonObject.redirectTo);
}
由于jsonObject.redirectTo为null,因此失败。 如果在我的控制器中我将Url.Action更改为“Profile / Index”,则测试通过。 但Url.Action(“Index”,“Profile”)失败,因为它仅在单元测试中变为null。
如果我尝试在上下文设置中为测试设置路由值,则会抱怨它们已经注册。我正在使用Moq。 知道我需要设置什么吗? 非常感谢提前
答案 0 :(得分:0)
答案可以在this link
找到复制代码以获得更持久性:
public static void SetupWithHttpContextAndUrlHelper(this Controller controller)
{
var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);
//setup request
var requestContextMock = new Mock<HttpRequestBase>();
requestContextMock.Setup(r => r.AppRelativeCurrentExecutionFilePath).Returns("/");
requestContextMock.Setup(r => r.ApplicationPath).Returns("/");
//setup response
var responseMock = new Mock<HttpResponseBase>();
responseMock.Setup(s => s.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(s => s);
//setup context with request and response
var httpContextMock = new Mock<HttpContextBase>();
httpContextMock.Setup(h => h.Request).Returns(requestContextMock.Object);
httpContextMock.Setup(h => h.Response).Returns(responseMock.Object);
controller.ControllerContext = new ControllerContext(httpContextMock.Object, new RouteData(), controller);
controller.Url = new UrlHelper(new RequestContext(httpContextMock.Object, new RouteData()), routes);
}