簡體   English   中英

ASP.NET Core - 模型綁定測試

[英]ASP.NET Core - Model binding testing

我發現以下帖子描述了如何測試自定義模型綁定器:

https://stackoverflow.com/a/55387164/155899

但是,這會測試單個模型綁定器。 理想情況下,我希望能夠注冊我的所有活頁夾並測試是否綁定了適當的模型。 這就是我如何實現我在 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 提供的鏈接幫助我解決了這個問題。

[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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM