Asp.net mvc 如何在ASP.NET MVC中模拟成员类以启用测试

Asp.net mvc 如何在ASP.NET MVC中模拟成员类以启用测试,asp.net-mvc,unit-testing,mocking,asp.net-membership,Asp.net Mvc,Unit Testing,Mocking,Asp.net Membership,我正在构建一个允许用户注册的ASP.NETMVC3站点。为此,我使用内置(静态)Membership类;有人说它是臃肿的,但它工作得很好,很容易,所以你有 无论如何,我已经开始编写和AdminService类,该类将处理与用户帐户相关的功能,我们假设它只有一个方法: public class AdminService : IAdminService { public void DeleteUser(string username) { Membership.DeleteU

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

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

public class AdminService : IAdminService
{
   public void DeleteUser(string username)
   {
      Membership.DeleteUser(username);
   }
}
像这样使用成员类有两种错误:它不能通过IoC注入,而且我发现为
IAdminService
编写规范(测试)越来越困难,因为我无法模拟成员类

有没有一种方法可以使ASP.NET成员资格类测试友好和依赖项注入友好,而不必使用我自己的方法

当涉及到功能时,Membership类工作得很好,更重要的是,它
现在可以工作了,所以我真的不愿意开始编写我自己的会员资格提供商,因为这只会让我慢下来。

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

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


其中一个方法中的方法总数非常少,如果您想伪造这些方法,那么拥有这些方法并不是一件坏事。

如果您创建了非空的ASP.NET MVC 3项目,则模型文件夹中将有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);
}

感谢用户控制;我通常从一个自制的“模板”开始,而我完全忘记了IMembershipService接口。