首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moq Roles.AddUserToRole测试

Moq Roles.AddUserToRole测试
EN

Stack Overflow用户
提问于 2009-11-23 16:16:57
回答 4查看 2.9K关注 0票数 4

我正在使用Moq和MvcContrib TestHelper类为ASP.NET MVC1.0中的一个项目编写单元测试。我遇到了一个问题。

当我在我的AccountController中访问Roles.AddUserToRole时,我得到了一个System.NotSupportedException。Roles类是静态的,并且Moq不能模拟静态类。

我能做什么?

EN

回答 4

Stack Overflow用户

发布于 2009-11-23 16:31:28

你可以使用像DI (依赖注入)这样的模式。在您的示例中,我将向AccountController传递一个RoleProvider,这将是默认的RoleProvider,并在您的测试中传递一个模拟对象。类似于:

代码语言:javascript
复制
public class AccountController
{
    private MembershipProvider _provider;
    private RoleProvider roleProvider;

    public AccountController()
      : this(null, null)
    {
    }

    public AccountController(MembershipProvider provider, RoleProvider roleProvider)
    {
      _provider = provider ?? Membership.Provider;
      this.roleProvider = roleProvider ?? System.Web.Security.Roles.Provider;
    }
}

MVC运行时将调用默认构造函数,该构造函数将使用默认角色提供程序初始化AccountController。在您的单元测试中,您可以直接调用重载构造函数,并传递一个MockRoleProvider (或使用Moq为您创建它):

代码语言:javascript
复制
[Test]
public void AccountControllerTest()
{
    AccountController controller = new AccountController(new MockMembershipProvider(), new MockRoleProvider());
}

编辑:下面是我模拟整个HttpContext的方式,包括主要用户。要获取HttpContext的Moq版本,请执行以下操作:

代码语言:javascript
复制
public static HttpContextBase GetHttpContext(IPrincipal principal)
{
  var httpContext = new Mock<HttpContextBase>();
  var request = new Mock<HttpRequestBase>();
  var response = new Mock<HttpResponseBase>();
  var session = new Mock<HttpSessionStateBase>();
  var server = new Mock<HttpServerUtilityBase>();
  var user = principal;


  httpContext.Setup(ctx => ctx.Request).Returns(request.Object);
  httpContext.Setup(ctx => ctx.Response).Returns(response.Object);
  httpContext.Setup(ctx => ctx.Session).Returns(session.Object);
  httpContext.Setup(ctx => ctx.Server).Returns(server.Object);
  httpContext.Setup(ctx => ctx.User).Returns(user);

  return httpContext.Object;
}

一个模拟实现的原则:

代码语言:javascript
复制
  public class MockPrincipal : IPrincipal
  {
    private IIdentity _identity;
    private readonly string[] _roles;

    public MockPrincipal(IIdentity identity, string[] roles)
    {
      _identity = identity;
      _roles = roles;
    }

    public IIdentity Identity
    {
      get { return _identity; }
      set { this._identity = value; }
    }

    public bool IsInRole(string role)
    {
      if (_roles == null)
        return false;
      return _roles.Contains(role);
    }
  }

A MockIdentity:

代码语言:javascript
复制
public class MockIdentity : IIdentity
  {
    private readonly string _name;

    public MockIdentity(string userName)    {
      _name = userName;
    }

    public override string AuthenticationType
    {
      get { throw new System.NotImplementedException(); }
    }

    public override bool IsAuthenticated
    {
      get { return !String.IsNullOrEmpty(_name); }
    }

    public override string Name
    {
      get { return _name; }
    }
  }

还有神奇的召唤:

代码语言:javascript
复制
MockIdentity identity = new MockIdentity("JohnDoe");
var httpContext = MoqHelpers.GetHttpContext(new MockPrincipal(identity, null));

请注意,我编辑了上面的代码,去掉了一些自定义的东西,但我非常确定这应该仍然可以工作。

票数 7
EN

Stack Overflow用户

发布于 2009-11-23 17:48:53

现在,当我尝试在ASP.NET MVC中测试ChangePassword()方法时,我遇到了另一个问题。

代码语言:javascript
复制
        try
        {
            if (MembershipService.ChangePassword(User.Identity.Name, currentPassword, newPassword))
            {
                if (!TempData.ContainsKey("ChangePassword_success"))
                {
                    TempData.Add("ChangePassword_success", true);
                }

                return PartialView("ChangePassword");

            }

现在,当我到达这一行时,我得到User为null。在我的测试类中,我有:

代码语言:javascript
复制
mockMembershipService.Setup(cp => cp.ChangePassword("johndoe", currentPassword, newPassword)).Returns(true);

我以为这会起作用,但它并不关心我发送"johndoe“。如果我模拟IPrincipal,那么用户属性是只读的。

票数 0
EN

Stack Overflow用户

发布于 2009-11-23 18:17:26

TypeMock隔离器做静力学等模拟,但我第二个(和+1'd) Razzie的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1781745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档