gpt4 book ai didi

asp.net-mvc-3 - 单元测试 Url.IsLocalUrl(returnUrl.ToString()),如何让它在单元测试中返回 false?

转载 作者:行者123 更新时间:2023-12-02 02:19:45 27 4
gpt4 key购买 nike

从 MVC3 应用程序中帐户 Controller 中的标准 LogOn 方法,我如何测试

Url.IsLocalUrl(returnUrl.ToString()) 

其中 url 不是本地的代码行?换句话说,在单元测试时我必须将什么 url 输入到这行代码中才能使其返回 false?

我使用了以下想法,这将返回为 false(非本地):

Uri uri = new Uri(@"http://www.google.com/blahblah.html");

但它只是在单元测试中抛出了一个空异常

编辑:我应该补充一点,LogOn 方法现在如下所示:

public ActionResult LogOn(LogOnModel model, System.Uri returnUrl)

if (ModelState.IsValid) {

bool loggedOn = LogOn(model);

if (loggedOn) {
if (Url.IsLocalUrl(returnUrl.ToString())) {
return Redirect(returnUrl.ToString());
}
else {
return RedirectToAction("Index", "Home");
}
}
else {
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}

// If we got this far, something failed, redisplay form
return View(viewModel);
}

某些样式的警察/代码分析错误强制从字符串参数更改为 System.uri 参数,但它与标准原始参数非常相似。

只是为了澄清,在单元测试中 - 我想测试并断言点击重定向到 Home/IndexElse 行的结果,所以我需要将某些内容传递到 (System.Uri)returnUrl 中,使其在 Url.IsLocalUrl 上返回 false,并且不会引发异常

进一步编辑:

我正在使用 MvcContrib testhelper,它非常擅长模拟大量 httpcontext 和 web 内容:

Builder = new TestControllerBuilder();
UserController = new UserController();
Builder.InitializeController(UserController);

最佳答案

您需要在要进行单元测试的 Controller 上模拟 HttpContext 以及 UrlHelper 实例。下面是一个示例,说明如果您使用 Moq,单元测试可能会是什么样子。 :

[TestMethod]
public void LogOn_Should_Redirect_To_Home_If_Authentication_Succeeds_But_Not_Local_ReturnUrl_Is_Provided()
{
// arrange
var sut = new AccountController();
var model = new LogOnModel();
var returnUrl = new Uri("http://www.google.com");
var httpContext = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
httpContext.Setup(x => x.Request).Returns(request.Object);
request.Setup(x => x.Url).Returns(new Uri("http://localhost:123"));
var requestContext = new RequestContext(httpContext.Object, new RouteData());
sut.Url = new UrlHelper(requestContext);

// act
var actual = sut.LogOn(model, returnUrl);

// assert
Assert.IsInstanceOfType(actual, typeof(RedirectToRouteResult));
var result = (RedirectToRouteResult)actual;
Assert.AreEqual("Home", result.RouteValues["controller"]);
Assert.AreEqual("Index", result.RouteValues["action"]);
}

备注:由于您实际上已经显示了您调用来验证凭据的 LogOn 实现,因此您可能需要调整单元测试以确保此方法首先返回 true模型以便输入 if (loggedOn) 子句。

<小时/>

更新:

您似乎正在使用 MvcContrib.TestHelper它为您完成所有 HttpContext 模拟设置。因此,您需要做的就是模拟单元测试的相关部分:

[TestMethod]
public void LogOn_Should_Redirect_To_Home_If_Authentication_Succeeds_But_Not_Local_ReturnUrl_Is_Provided()
{
// arrange
var sut = new AccountController();
new TestControllerBuilder().InitializeController(sut);
var model = new LogOnModel();
var returnUrl = new Uri("http://www.google.com");
sut.HttpContext.Request.Expect(x => x.Url).Return(new Uri("http://localhost:123"));

// act
var actual = sut.LogOn(model, returnUrl);

// assert
actual
.AssertActionRedirect()
.ToController("Home")
.ToAction("Index");
}

通常,单元测试的前 2 行可以移至全局 [SetUp] 方法,以避免在此 Controller 的每个单元测试中重复它们,这样现在您的测试就会变得更干净一些:

[TestMethod]
public void LogOn_Should_Redirect_To_Home_If_Authentication_Succeeds_But_Not_Local_ReturnUrl_Is_Provided()
{
// arrange
var model = new LogOnModel();
var returnUrl = new Uri("http://www.google.com");
_sut.HttpContext.Request.Expect(x => x.Url).Return(new Uri("http://localhost:123"));

// act
var actual = _sut.LogOn(model, returnUrl);

// assert
actual
.AssertActionRedirect()
.ToController("Home")
.ToAction("Index");
}

关于asp.net-mvc-3 - 单元测试 Url.IsLocalUrl(returnUrl.ToString()),如何让它在单元测试中返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9463201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com