2012-01-11 10 views
0

これはDependency Injection with Custom Membership Providerと似ていますが、そこの応答は私の問題を解決しません。依存性注入を使用したカスタムメンバーシッププロバイダ - テスト方法

私はリポジトリクラスへの依存性を持つカスタムメンバーシッププロバイダを持っています。

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

そして、その解決方法:ASP.NETはいつも、私は...私のctorのは、このように見えるサービスロケータメソッドのようなものを持っているリポジトリへの依存関係を解決するために、パラメータなしのコンストラクタを使用して、これをインスタンス化しますこのようになります。

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

_kernelが正しくセットアップされているため、これは正常に動作します。ただし、メンバーシッププロバイダのメソッドをテストする必要があります。したがって、テストコードがメンバーシッププロバイダのメソッドを呼び出そうとすると、_kernelがセットアップされていないため、paramter-less ctorで新しいメンバーシッププロバイダクラスをインスタンス化します。

私がやりたいことは、代わりに私のFakeUserRepositoryクラスを挿入することですが、どうすれば実現できますか?

私はリポジトリインスタンスを受け入れるメンバシッププロバイダへのctorを追加しました、そして、私は私のテストクラスで私のメンバシッププロバイダを手動でインスタンス化してきました

...私は、このための作業ラウンドを持っていると思う

答えて

1

このように:私はこれをしたらいけない

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に追加する必要があります。それでも問題はありません。これはやや難解です。

+0

私にはかなり良い解決策と思われます。 –

1

カスタムメンバーシップ・プロバイダからすべてを実装クラスに抽出し、サービス・ロケータを介してそのクラスをインスタンス化してから、すべての呼び出しをそれに渡すのはなぜですか?実装クラスは単体テスト可能であり、醜いメンバシップのものは「検査で正しい」ことができます。

+0

それは実際には悪い考えではありません。もし私が最初から始めていたら、おそらくそれをするでしょう –

関連する問題