私も同様の設定をしていますが、Ninjectの代わりにUnityを使用しています。
私のIoCコンテナはUnityContainerを継承し、すべてのリポジトリ、バリデーターなどを登録します。リポジトリに依存するバリデーターがあるため、これから恩恵を受けます(たとえば、UserRegistrationValidatorは一意のユーザー名をチェックします)。
私のIoCコンテナはIValidatorFactoryも実装しています。私はそれを使用して、次のようなグローバルModelValidatorProviderを登録します。
var ioc = new IoCContainer();
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(ioc));
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
この設定では、バリデーターがValidatorFactoryによって解決された場合にのみ、バリデーターがコントローラーアクションでモデル検証をインターセプトすることを知っています。
だから基本的に私は2つのグループのテストを持っています
-IoCテスト
これらを使用して、IoCコンテナがモデルのバリデーターを解決できるかどうかをテストします。Unityを使用すると、次のようになります。
// Arrange
var ioc = new IoCContainer();
// Assert
Assert.IsTrue(ioc.IsRegistered(IValidator<MyModel>));
すべてのモデルが1つの名前空間にある場合は、特定の名前空間からすべての型を取得して単一の単体テストを記述し、IValidatorがループに登録されているかどうかを確認することもできます。
-バリデーターテスト
これらは、私の(表示)モデルをテストするための一般的なテストです。
// Arrange
var validator = new MyModelValidator();
var model = new MyModel{ Name = null };
// Assert
validator.ShouldHaveValidationErrorFor(x => x.Name, model)
これにより、アプリケーションをスピンする必要はなく、作成したものをテストするだけです。
お役に立てれば。