这类似于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类,但我怎样才能实现呢?
答案 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)
为什么不将所有从您的自定义成员资格提供程序中提取到实现类中,并通过服务定位器实例化该类,然后将所有调用传递给它?然后,实现类可以是单元可测试的,丑陋的会员资格可以“通过检查”。