c# - ASP.NET - 单元测试 MembershipProvider

标签 c# asp.net unit-testing testing

我正在尝试对 MembershipProvider 进行单元测试,但是我不知道如何或是否需要对其进行单元测试...

我的业务层:

public interface IAccountService
{
    MembershipCreateStatus CreateUser(string userName, string password, string email);
}

public class AccountService : IAccountService
{
    private readonly MembershipProvider provider;

    public AccountService() : this(null) { }
    public AccountService(MembershipProvider providera)
    {
        this.provider = providera ?? Membership.Provider;
    }

    public MembershipCreateStatus CreateUser(string userName, string password, string email)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", userName);
        if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", password);
        if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", email);

        MembershipCreateStatus status;
        provider.CreateUser(userName, password, email, null, null, true, null, out status);

        return status;
    }
}

到目前为止,我发现的唯一示例需要具有本地数据库设置的“MockMembershipProvider”……对我来说似乎很奇怪。

提前致谢。

最佳答案

有几个原因让“具有本地数据库设置的 MockMembershipProvider”很奇怪。

通常您不想对数据访问代码进行单元测试。您的单元测试应该运行得非常快,并且经常运行,因此不需要数据库访问。这就是为什么你应该能够模拟你的数据访问层。持久化数据对于集成测试是可以接受的,但通常不是单元测试。

此答案的其余部分基于您不想在单元测试中访问数据库的假设。


您是否希望对成员(member)提供程序进行单元测试将取决于其中发生的事情。

  1. 如果成员资格提供程序是自定义编写的并且包含业务逻辑,那么应该对其进行单元测试。如果是这种情况你 需要在成员资格提供者创建一个模拟 DAO 对象,这样成员资格提供者就可以通过单元测试来执行,而无需 命中数据库。

  2. 如果成员(member)提供者只是简单地执行数据库访问(直接访问或将调用转移到数据访问层), 你不应该对它进行单元测试。如果您使用的是 Microsoft asp.net 成员(member)提供程序,您也不应该对其进行测试。

    相反,您应该创建一个模拟的 MembershipProvider 以在 AccountService 类中使用。您将使用构造函数注入(inject)来注入(inject)模拟,这是以下样板代码的目的

    public AccountService() : this(null) { }
    public AccountService(MembershipProvider providera)
    {
        this.provider = providera ?? Membership.Provider;
    }
    

    此代码有助于替代实现(包括模拟)的构造函数注入(inject)。测试可能是什么样子的示例:

        [Test]
        public void ExampleTestWithAHandRolledMock()
        {
            //arrange
            var mockMembershipProvider = new MockMembershipProvider();//no db access in this mock implementation
            var accountService = new AccountService(mockMembershipProvider);
            //act
            accountService.CreateUser("foo", "bar", "baz");
            //assert
            Assert.IsTrue(mockMembershipProvider.MockUserExists("foo","bar","baz");//added a method to mock to confirm user was added
        }
    

关于c# - ASP.NET - 单元测试 MembershipProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237858/

相关文章:

c# - 使用控制台或 WindowsService 的 AsyncOperation

c# - 在c#中查找csv或文本文件的分隔符

asp.net - 我们可以在 gmail 中使用 google roboto 字体吗?

c# - 如何在测试类(ASP.NET Core)中注入(inject)配置设置?

java - 单元测试 Spark 流

c# - 在 WCF 服务中记录 IP 地址

c# - 在 C# 中以编程方式创建 DHCP 预留

javascript - ASP.NET:如何从弹出窗口获取 JavaScript 变量?

c# - 检查值是否为空 C# 时重定向循环

java - 如何在单元测试环境中配置 log4j?