[英]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.