我有类似的设置,但我使用 Unity 而不是 Ninject。
我的 IoC 容器继承了 UnityContainer,我在其中注册了所有 repos、validarots 等。我从中受益,因为我有具有 repo 依赖项的验证器(例如,UserRegistrationValidator 检查唯一用户名)。
我的 IoC 容器也实现了 IValidatorFactory。我使用它注册一个全局 ModelValidatorProvider ,如下所示:
var ioc = new IoCContainer();
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(ioc));
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
通过这种设置,我知道我的验证器将拦截控制器操作中的模型验证,但前提是验证器由 ValidatorFactory 解析。
所以基本上我有两组测试
- 国际奥委会测试
使用这些我测试我的 IoC 容器是否可以解析模型的验证器。使用 Unity,它看起来像这样:
// Arrange
var ioc = new IoCContainer();
// Assert
Assert.IsTrue(ioc.IsRegistered(IValidator<MyModel>));
如果您将所有模型都放在一个命名空间下,您甚至可以通过从特定命名空间获取所有类型并检查 IValidator 是否在循环中为它们注册来编写单个单元测试。
- 验证器测试
这些是测试我的(视图)模型的常见测试:
// Arrange
var validator = new MyModelValidator();
var model = new MyModel{ Name = null };
// Assert
validator.ShouldHaveValidationErrorFor(x => x.Name, model)
这样就不需要旋转应用程序,您只需测试您创建的内容。
希望这可以帮助。