我正在尝试对 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)提供程序进行单元测试将取决于其中发生的事情。
如果成员资格提供程序是自定义编写的并且包含业务逻辑,那么应该对其进行单元测试。如果是这种情况你 需要在成员资格提供者内创建一个模拟 DAO 对象,这样成员资格提供者就可以通过单元测试来执行,而无需 命中数据库。
如果成员(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/