【问题标题】:How to mock Membership class in ASP.NET MVC to enable testing如何在 ASP.NET MVC 中模拟 Membership 类以启用测试
【发布时间】:2010-12-12 14:39:32
【问题描述】:

我正在构建一个允许用户注册的 ASP.NET MVC 3 站点。为此,我使用内置(静态)Membership 类;有人说它很臃肿,但它工作得很好而且很容易,所以你就在那里。

无论如何,我已经开始编写 AdminService 类来处理与用户帐户相关的功能,让我们假设它只有一种方法:

public class AdminService : IAdminService
{
   public void DeleteUser(string username)
   {
      Membership.DeleteUser(username);
   }
}

以两种方式错误地使用 Membership 类:它不能通过 IoC 注入,而且我发现为 IAdminService 编写规范(测试)越来越困难,因为我无法模拟 Membership 类。

有没有办法让 ASP.NET Membership 类对测试友好且对依赖注入友好,而无需自己动手?

在功能方面,Membership 类运行良好,更重要的是,它 现在可以工作,所以我真的不愿意开始编写自己的 MembershipProvider,因为它只会减慢我的速度。

【问题讨论】:

    标签: asp.net-mvc unit-testing mocking asp.net-membership


    【解决方案1】:

    如果您创建非空的 ASP.NET MVC 3 项目,您的 Models 文件夹中将会有 AccountModels.cs 文件。它包含一个如何处理成员资格以启用单元测试的示例:

    public interface IMembershipService
    {
        int MinPasswordLength { get; }
    
        bool ValidateUser(string userName, string password);
        MembershipCreateStatus CreateUser(string userName, string password, string email);
        bool ChangePassword(string userName, string oldPassword, string newPassword);
    }
    

    【讨论】:

    • 感谢 UserControl;我通常从一个自制的“模板”开始,我完全忘记了 IMembershipService 接口。
    【解决方案2】:

    我在构建 MVC 站点时遇到了同样的情况,最终推出了我自己的(可测试的)提供程序。

    话虽如此,一种选择是从here 中提取示例实现——您可以(理论上)构建一个 FakeProvider,并对各种返回方法进行硬编码,而不是访问 SQL 数据库。

    其中一个方法的总数非常少,当你想伪造它们时,拥有它并不是一件坏事。

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多