gpt4 book ai didi

c# - Membership.CreateUser 的 ASP.NET MVC 3 单元测试总是返回 MembershipCreateStatus 错误

转载 作者:行者123 更新时间:2023-11-30 19:00:03 24 4
gpt4 key购买 nike

我正在尝试编写一个单元测试来创建一个新用户并验证是否发生了所需的重定向。这是我的 Register 操作,它几乎是来自 VS 模板的现成代码:

[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError(String.Empty, ErrorCodeToString(createStatus));
}
}

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

下面是我的测试,使用 Moq。无论我设置什么,我总是从默认的 MembershipCreateStatus 错误消息之一中收到错误消息。例如:

The password provided is invalid. Please enter a valid password value

The password retrieval answer provided is invalid

我已经尝试将 CreateUser 方法更改为仅调用用户名、密码和电子邮件重载,但这并不重要。这就像在某处执行密码策略的支票。

public void RegisterPost_WithAuthenticatedUser_RedirectsToHomeControllerIfSuccessful()
{
// Arrange
var accountController = new AccountController();
var mockContext = GetMockRequestContext();

ControllerContext controllerContext = new ControllerContext(mockContext.Object, accountController);
accountController.ControllerContext = controllerContext;

RegisterModel registerModel = new RegisterModel() { UserName = "someone", Email = "someone@example.com", Password = "user", ConfirmPassword = "password" };

// Act
var result = accountController.Register(registerModel);

// Assert
Assert.That(result.RouteData.Values["Controller"], Is.EqualTo("Home"));
Assert.That(result.RouteData.Values["Action"], Is.EqualTo("Index"));
}

谁能告诉我这是怎么回事?

最佳答案

静态类/方法问题再次出现!

静态方法Membership.CreateUser在这里是一个隐藏的依赖,因为看起来你的 Controller 没有依赖,但实际上它依赖于这个方法,你没有替换(或被能够在您的测试中替换)此依赖项,以便您可以控制交互。

您需要做的是使这种依赖关系显式化。通过引入一个接口(interface)来实现这一点,该接口(interface)模拟与成员资格提供者所需的交互(比如称为 IMembershipService)。

为此创建一个默认实现,它只委托(delegate)给现有的静态方法,如 Membership.CreateUser()。在你的 Controller 中,在构造函数中需要一个这个接口(interface)的实例(或者如果必须的话,在默认构造函数中创建一个默认实现的实例 - 不是首选选项,但是......)

然后在您的测试中创建此接口(interface)的模拟并设置所需的期望,并将此模拟传递给您的 Controller ,并验证它是否符合您的预期。

如果您不使用模拟,那么您将在每次测试运行时继续在您的数据库中创建新用户。这可能没问题,如果你每次都重置你的数据库,但从长远来看使用模拟更简单和更快,尽管设置需要更多的努力,因为你必须创建一个无空参数的构造函数 Controller 并引入一些接口(interface)将隐式依赖分解为显式依赖。

关于c# - Membership.CreateUser 的 ASP.NET MVC 3 单元测试总是返回 MembershipCreateStatus 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6184191/

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