【问题标题】:ASP.NET - Unit test MembershipProviderASP.NET - 单元测试 MembershipProvider
【发布时间】:2010-11-21 12:40:20
【问题描述】:

我正在尝试对 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”......对我来说似乎很奇怪。

提前致谢。

【问题讨论】:

  • 您在哪些方面需要帮助?您想获得将测试您的 Provider 的单元测试的想法吗?

标签: c# asp.net unit-testing testing


【解决方案1】:

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

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

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


您是否希望对成员资格提供程序进行单元测试将取决于那里发生的事情。

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

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

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

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

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

        [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
        }
    

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 2011-08-03
    • 1970-01-01
    • 2019-12-13
    • 2012-03-18
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多