带依赖注入的自定义成员资格提供程序 - 如何测试

时间:2012-01-11 08:59:25

标签: c# asp.net asp.net-mvc asp.net-membership ninject

这类似于Dependency Injection with Custom Membership Provider,但那里的回答并没有为我解决问题。

我有一个自定义成员资格提供程序,它依赖于存储库类。 ASP.NET将始终使用无参数构造函数实例化,因此要解析对存储库的依赖,我有一种服务定位器方法...我的ctor看起来像这样:

public CustomMembershipProvider()
{
    _userRepository = AppStart_NinjectMVC3.Resolve<IUserRepository>();
}

Resolve方法看起来像这样..

public static T Resolve<T>() where T : class
{
    return _kernel.Get<T>();
}

当我运行Web应用程序时,这很正常,因为_kernel已正确设置。但是,我需要在我的成员资格提供程序上测试方法。因此,当我的测试代码尝试调用成员资格提供程序上的方法时,它将使用无参数ctor实例化一个新的成员资格提供程序类,由于未设置_kernel而导致错误。

我想要做的是以某种方式注入我的FakeUserRepository类,但我怎样才能实现呢?

2 个答案:

答案 0 :(得分:1)

我想我有一个工作轮...

我已经向接受存储库实例的成员资格提供程序添加了一个ctor,然后我在我的测试类中手动实例化了我的成员资格提供程序,如下所示:

var prov = new CableSenseMembershipProvider(new FakeUserRepository());
        var config = new NameValueCollection();
        config.Add("applicationName", "ddd");
        config.Add("name", "CustomMembershipProvider");
        config.Add("requiresQuestionAndAnswer", "false");
        config.Add("requiresUniqueEmail", "false");
        prov.Initialize(config["name"], config);

一旦我没有这个,我就可以调用那个实例而不用担心被调用的无参数ctor。

顺便说一句,您仍然需要将您的成员资格部分添加到您的测试项目app.config中,否则它将无法正常工作 - 这有点令人困惑!

答案 1 :(得分:1)

为什么不将所有从您的自定义成员资格提供程序中提取到实现类中,并通过服务定位器实例化该类,然后将所有调用传递给它?然后,实现类可以是单元可测试的,丑陋的会员资格可以“通过检查”。