- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个单元测试来创建一个新用户并验证是否发生了所需的重定向。这是我的 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/
我跑了: $ createuser --pwprompt 看到了: Enter password for new role: 我希望系统会提示我输入用户名,所以此时我按了 CTRL+C。 man 页面
我正在将代码移出 App_Code进入类库。 我使用 Membership.CreateUser 以编程方式创建用户. 在无法访问我在 web.config 中配置的成员资格提供程序的情况下,如何在我
我不明白,我创建了这个方法 import { Accounts } from 'meteor/accounts-base'; import SimpleSchema from 'simpl-schem
我刚刚切换到 .Net 成员(member)提供程序来管理我的用户。我有一个与名为 UserGroupDetails 的用户表相关的表。当调用 Membership.CreateUser 时,我想在此
请不要将此问题移至 askubuntu,因为我认为此问题不是特定于操作系统的。 当我调用 createuser postgres 命令时(现在我是否提供任何参数都没有关系),我收到此错误: creat
我正在使用 vagrant 设置一台新的 Ubuntu 机器。通过配置,我需要创建一个新的 postgres 用户。目前我正在使用: sudo su postgres createuser -P my
我一直在仔细阅读 Firebase 的文档来尝试注册用户。我使用的是 Angular 1.3 和 Firebase 1.0.24。 我只是想创建一个用户。 这是我的 Firebase 规则: {
这个问题已经有答案了: How do I return the response from an asynchronous call? (42 个回答) 已关闭 7 年前。 我想在Javascript
我的应用程序结构要求我使用特定的 Uid 登录用户. 我可以在 Firebase Auth 中做到这一点吗? 我的意思是,如果我想用 uid=1 创建一个用户. 我将与电子邮件和密码一起发送。 是否可
我目前正在开发一个涉及使用 Meteor JS 的项目。 我的问题是我不能有重复的电子邮件地址(我希望用户名是唯一的,而不是电子邮件)。我不断收到错误: Error: Email already ex
我使用的是 Firebase 1.1(嵌入了旧的 firebase-simple-login 功能)。 现在,在创建用户时,如何获取它的 id(或 uid)? app.controller('Auth
我使用的示例 Java 代码: public static AjaxResponse createUser(User newUser) { Keycloak keycloak = Keyclo
我在这方面陷入僵局。我正在尝试使用 $firebaseAuth 而不是已弃用的 FirebaseSimpleLogin 创建一个 AngularFire 用户,正如文档中所建议的那样。我确定该表单提交
我理解在客户端和服务器中都有业务逻辑的原因,但我不太明白在某些情况下如何做到这一点。例如: // client/client.js // hnadling click event on the Cre
我在 .NET MVC 3 razor 网站上工作,我想知道在使用 Membership.CreateUser 时数据保存在哪里? 关于 http://msdn.microsoft.com/en-us
我使用此代码调用我的自定义成员资格提供程序方法: Membership.CreateUser(newUser.UserName, newUser.Password); 但我需要扩展一些参数。我已经写
我正在构建一个应用程序,人们无法自己创建帐户,但创建的第一个用户(我)可以在应用程序的表单中创建用户。 这就是我在/lib/config/account.js 中设置的原因:forbidClientA
Accounts.createUser 方法不再有效。几天前一切正常,我确信我没有改变任何东西。 我有一张注册表格。点击提交后,将执行以下代码: 编辑 我忘了说这个函数是在 meteor 方法中所以它
我使用 Homebrew 软件在 OS X Lion 上安装了最新版本的 postgres。路径正确: $ which postgres /usr/local/bin/postgres $ which
我对 Meteor 相当陌生,并试图掌握它的概念。我下面有一个客户端代码,它触发 Meteor 方法来创建新用户: Template["signup-team"].onRendered(functio
我是一名优秀的程序员,十分优秀!