簡體   English   中英

如何將真/假 object 分配給 Xunit 測試(模型綁定)的綁定上下文?

[英]how can I assign real/fake object to binding context for Xunit test (Model Binding)?

這是我要測試的方法


     public class DataRequestQueryBinder : IModelBinder
        {
            public Task BindModelAsync(ModelBindingContext bindingContext)
            {
                var jsonString = bindingContext.ActionContext.HttpContext.Request.Query["request"];
                if (string.IsNullOrWhiteSpace(jsonString))
                {
                    throw new ArgumentNullException("request");
                }
    
                var result = JsonConvert.DeserializeObject<DataRequestQuery>(jsonString);
                bindingContext.Result = ModelBindingResult.Success(result);
                return Task.CompletedTask;
            }
        }

我是單元測試的新手,下面是我對 Xunit 測試的嘗試,但我想通過代碼手動給它真正的 object,或者只是准備bindingContext.ActionContext.HttpContext.Request.Query["request"]; 如果需要。

  public class DataRequestQueryBinderTest
    {
        [Fact]
        public async Task BindingModleAsyncTest()
        {
            DataRequestQueryBinder dta = new DataRequestQueryBinder();
            ModelBindingContext bindingContext = Substitute.For<ModelBindingContext>();
            //await dta.BindModelAsync(bindingContext);
                   

            //bindingContext.ActionContext.HttpContext
            var value1 = dta.BindModelAsync(bindingContext);

            //var value = Task.Run(async () => await dta.BindModelAsync(bindingContext));
            Assert.True(dta.BindModelAsync(bindingContext).IsCompleted);
            Assert.NotNull(value1);
        }
    }
}

晚了,但我自己找到了解決方案,它可能會幫助其他人,看看我做的解決方案。

public class DataRequestQueryBinderTest
    {
        [Fact]
        public async Task BindModelAsyncTest()
        {
            //--- assemble
            var requestFake = new HttpRequestFeature();
            requestFake.QueryString = "request={// your own request}";
          
            var features = new FeatureCollection();
            features.Set<IHttpRequestFeature>(requestFake);
            var fakeHttpContext = new DefaultHttpContext(features);
            var bindingContext = new DefaultModelBindingContext
            {
                ModelName = "CustomQueryExpr",
                ActionContext = new ActionContext()
                {
                    HttpContext = fakeHttpContext,
                },
            };

            var binder = new DataRequestQueryBinder();

            //--- act
            await binder.BindModelAsync(bindingContext);

            //--- assert
            Assert.True(bindingContext.Result.IsModelSet);
        }
    }

暫無
暫無

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

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