Nhibernate 测试自定义ASP.NET成员资格提供程序

Nhibernate 测试自定义ASP.NET成员资格提供程序,nhibernate,membership-provider,Nhibernate,Membership Provider,我正在使用自定义asp.net成员资格提供程序和底层nhibernate数据访问代码,这很好。现在我需要使用测试来练习这些方法 有人想建议如何测试这些方法吗?提供一些链接来解释使用一些标准的测试方法 这是我的第一个问题,所以请温和一点:)当涉及到单元测试任何对数据库或第三方库执行操作的代码时,您应该将这些依赖项解耦,以便您的测试只测试您的代码 例如,如果我们的成员资格提供程序中有一个用于添加单个用户的方法,那么我们要测试的是该方法的代码是否正常工作,而不是数据库是否已启动并正在运行,或者该方法调

我正在使用自定义asp.net成员资格提供程序和底层nhibernate数据访问代码,这很好。现在我需要使用测试来练习这些方法

有人想建议如何测试这些方法吗?提供一些链接来解释使用一些标准的测试方法


这是我的第一个问题,所以请温和一点:)

当涉及到单元测试任何对数据库或第三方库执行操作的代码时,您应该将这些依赖项解耦,以便您的测试只测试您的代码

例如,如果我们的成员资格提供程序中有一个用于添加单个用户的方法,那么我们要测试的是该方法的代码是否正常工作,而不是数据库是否已启动并正在运行,或者该方法调用的方法是否正常工作。即使数据库脱机或其他类的方法调用失败,我们的单元测试也应该通过

这就是嘲弄发挥作用的地方。您需要模拟您的数据上下文,并设置要在其上使用的任何方法,以便可以控制其响应


仔细查看您的成员资格提供程序中的方法。每个人应该做什么?这是你唯一真正想测试的东西。这个方法,作为一个独立的单元,是否能完成我期望的工作。

成员资格提供者很难模拟和测试,所以我个人不介意。然而,我要做的是将所有成员代码放在易于测试的类中

我的大多数自定义提供程序如下所示:

public class CustomMembershipProvider : MembershipProvider
    {
        private readonly IUserService _userService;

        public ButlinsMembershipProvider()
        {
            _userService = DI.Resolve<IUserService>();
        }

        public override bool ValidateUser(string username, string password)
        {
            return _userService.Authenticate(username, password);
        }
}
公共类CustomMembershipProvider:MembershipProvider
{
专用只读IUserService\u userService;
公共ButlinMembershipProvider()
{
_userService=DI.Resolve();
}
公共覆盖bool ValidateUser(字符串用户名、字符串密码)
{
返回_userService.Authenticate(用户名、密码);
}
}

在本例中,我将编写集成测试来验证用户服务的行为。我不测试提供商。

您尝试过这个吗?我想在成员资格提供程序中测试我的方法,而不进行模拟,比如,使用CreateUser方法将新用户添加到db表中,回滚事务以保持db在测试之前的状态。这是我应该遵循的方法吗?嘲笑对我来说很奇怪:)我个人认为嘲笑是一种更有效的方法。如果你在数据库中插入和回滚数据,那么你不仅仅是在测试你的代码单元,你在测试网络、网络连接、数据库引擎等。当我编写单元测试时,我希望我的代码能像我预期的那样工作,我不希望在网络关闭时测试失败。好的,模拟它是:)任何与模拟成员资格提供者的具体例子的链接