ASP.NET 核心 - 模型绑定测试
ASP.NET Core - Model binding testing
我发现以下 post 描述了如何测试自定义模型活页夹:
但是,这会测试单个模型活页夹。理想情况下,我希望能够注册我的所有绑定器并测试是否绑定了适当的模型。这就是我在 ASP.NET MVC:
中实现目标的方式
// Register the model binders
ModelBinders.Binders[typeof(DateTime)] = new DateTimeModelBinder();
...
var values = new NameValueCollection {
{ "Foo", "1964/12/02 12:00:00" }
};
var controllerContext = CreateControllerContext(); // Utility method
var bindingContext = new ModelBindingContext() {
ModelName = "Foo",
ValueProvider = new NameValueCollectionValueProvider(values, null)
};
var binder = ModelBinders.Binders.GetBinder(typeof(DateTime));
var result = (DateTime)binder.BindModel(controllerContext, bindingContext);
这不仅让我可以测试我的模型绑定器的结果,而且还可以确保选择了正确的模型绑定器。
如果有人能提供帮助,我将不胜感激。谢谢
我已经设法把一些东西放在一起了。感谢@HereticMonkey link 帮助了我。
[Fact]
public async Task Test() {
// Arrange
var services = new ServiceCollection();
services.AddSingleton<ILoggerFactory, NullLoggerFactory>();
services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
services.AddMvc(o => {
o.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());
});
var serviceProvider = services.BuildServiceProvider();
var options = serviceProvider.GetService<IOptions<MvcOptions>>();
var compositeDetailsProvider = new DefaultCompositeMetadataDetailsProvider(new List<IMetadataDetailsProvider>());
var metadataProvider = new DefaultModelMetadataProvider(compositeDetailsProvider);
var modelBinderFactory = new ModelBinderFactory(metadataProvider, options, serviceProvider);
var parameterBinder = new ParameterBinder(
metadataProvider,
modelBinderFactory,
new Mock<IObjectModelValidator>().Object,
options,
NullLoggerFactory.Instance);
var parameter = new ParameterDescriptor() {
Name = "parameter",
ParameterType = typeof(DateTime)
};
var controllerContext = new ControllerContext() {
HttpContext = new DefaultHttpContext() {
RequestServices = serviceProvider // You must set this otherwise BinderTypeModelBinder will not resolve the specified type
},
RouteData = new RouteData()
};
var modelMetadata = metadataProvider.GetMetadataForType(parameter.ParameterType);
var formCollection = new FormCollection(new Dictionary<string, StringValues>() {
{ "Foo", new StringValues("1964/12/02 12:00:00") }
});
var valueProvider = new FormValueProvider(BindingSource.Form, formCollection, CultureInfo.CurrentCulture);
var modelBinder = modelBinderFactory.CreateBinder(new ModelBinderFactoryContext() {
BindingInfo = parameter.BindingInfo,
Metadata = modelMetadata,
CacheToken = parameter
});
// Act
var modelBindingResult = await parameterBinder.BindModelAsync(
controllerContext,
modelBinder,
valueProvider,
parameter,
modelMetadata,
value: null);
// Assert
Assert.True(modelBindingResult.IsModelSet);
}
我发现以下 post 描述了如何测试自定义模型活页夹:
但是,这会测试单个模型活页夹。理想情况下,我希望能够注册我的所有绑定器并测试是否绑定了适当的模型。这就是我在 ASP.NET MVC:
中实现目标的方式// Register the model binders
ModelBinders.Binders[typeof(DateTime)] = new DateTimeModelBinder();
...
var values = new NameValueCollection {
{ "Foo", "1964/12/02 12:00:00" }
};
var controllerContext = CreateControllerContext(); // Utility method
var bindingContext = new ModelBindingContext() {
ModelName = "Foo",
ValueProvider = new NameValueCollectionValueProvider(values, null)
};
var binder = ModelBinders.Binders.GetBinder(typeof(DateTime));
var result = (DateTime)binder.BindModel(controllerContext, bindingContext);
这不仅让我可以测试我的模型绑定器的结果,而且还可以确保选择了正确的模型绑定器。
如果有人能提供帮助,我将不胜感激。谢谢
我已经设法把一些东西放在一起了。感谢@HereticMonkey link 帮助了我。
[Fact]
public async Task Test() {
// Arrange
var services = new ServiceCollection();
services.AddSingleton<ILoggerFactory, NullLoggerFactory>();
services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
services.AddMvc(o => {
o.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());
});
var serviceProvider = services.BuildServiceProvider();
var options = serviceProvider.GetService<IOptions<MvcOptions>>();
var compositeDetailsProvider = new DefaultCompositeMetadataDetailsProvider(new List<IMetadataDetailsProvider>());
var metadataProvider = new DefaultModelMetadataProvider(compositeDetailsProvider);
var modelBinderFactory = new ModelBinderFactory(metadataProvider, options, serviceProvider);
var parameterBinder = new ParameterBinder(
metadataProvider,
modelBinderFactory,
new Mock<IObjectModelValidator>().Object,
options,
NullLoggerFactory.Instance);
var parameter = new ParameterDescriptor() {
Name = "parameter",
ParameterType = typeof(DateTime)
};
var controllerContext = new ControllerContext() {
HttpContext = new DefaultHttpContext() {
RequestServices = serviceProvider // You must set this otherwise BinderTypeModelBinder will not resolve the specified type
},
RouteData = new RouteData()
};
var modelMetadata = metadataProvider.GetMetadataForType(parameter.ParameterType);
var formCollection = new FormCollection(new Dictionary<string, StringValues>() {
{ "Foo", new StringValues("1964/12/02 12:00:00") }
});
var valueProvider = new FormValueProvider(BindingSource.Form, formCollection, CultureInfo.CurrentCulture);
var modelBinder = modelBinderFactory.CreateBinder(new ModelBinderFactoryContext() {
BindingInfo = parameter.BindingInfo,
Metadata = modelMetadata,
CacheToken = parameter
});
// Act
var modelBindingResult = await parameterBinder.BindModelAsync(
controllerContext,
modelBinder,
valueProvider,
parameter,
modelMetadata,
value: null);
// Assert
Assert.True(modelBindingResult.IsModelSet);
}