【问题标题】:Custom Membership provider with dependency injection - how to test具有依赖注入的自定义成员资格提供程序 - 如何测试
【发布时间】:2012-01-11 08:59:24
【问题描述】:

这类似于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 类,但我该如何实现呢?

【问题讨论】:

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


    【解决方案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 中,否则它将无法工作 - 这有点令人困惑!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 其实这不是一个坏主意,如果我从头开始我可能会这样做
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多