【发布时间】:2019-03-15 03:31:38
【问题描述】:
我正在尝试调试与自定义 IModelBinder 实现相关的 xUnit,而 Visual Studio 调试器是:
- 在 JsonModelBinder 中没有达到我所有的断点
- 即使遇到每个 Task.Completed,也不会在 Task.Completed 上退出。
我的其他 xUnit 都没有这样的行为。在这一点上,唯一给我带来麻烦的单元是与 asp.net 核心管道相关的单元。我尝试清理我的解决方案并重新添加项目引用,认为可能有一个旧的 pdb 文件?
我正在使用 Moq、xUnit、VS2017、ASP.net Core 2.2。
// JsonModelBinder
public class JsonModelBinder : IModelBinder
{
private readonly IOptions<MvcJsonOptions> _jsonOptions;
private readonly ILoggerFactory _loggerFactory;
public JsonModelBinder() { }
public JsonModelBinder(IOptions<MvcJsonOptions> jsonOptions, ILoggerFactory loggerFactory)
{
_jsonOptions = jsonOptions;
_loggerFactory = loggerFactory;
}
public Task BindModelAsync(ModelBindingContext bindCtx)
{
string modelName = bindCtx.ModelName;
ValueProviderResult valueProviderResult = bindCtx.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
bindCtx.ModelState.SetModelValue(bindCtx.ModelName, valueProviderResult);
string value = valueProviderResult.FirstValue;
if (string.IsNullOrEmpty(value))
{
return Task.CompletedTask;
}
JToken token;
try
{
token = JToken.Parse(value);
}
catch (JsonReaderException)
{
bindCtx.ModelState.TryAddModelError(modelName, "Invalid json object.");
return Task.CompletedTask;
}
catch (Exception ex)
{
bindCtx.ModelState.TryAddModelError(modelName, ex.Message);
return Task.CompletedTask;
}
bindCtx.Result = ModelBindingResult.Success(token);
return Task.CompletedTask;
}
}
// xUnits
public class JsonModelBinderFacts
{
[Fact]
public async Task BindModelAsync_WithNullValueProvider_SetsDefaultError()
{
// arrange
var bindingCtx = new Mock<ModelBindingContext>();
bindingCtx
.Setup(x => x.ModelName)
.Returns("Test");
var valueProvider = new Mock<IValueProvider>();
bindingCtx
.Setup(x => x.ValueProvider)
.Returns(valueProvider.Object);
var providerResult = new ValueProviderResult(new StringValues(new []{ "test"}));
valueProvider
.Setup(x => x.GetValue("Test"))
.Returns(providerResult);
var binder = new JsonModelBinder();
// act
await binder.BindModelAsync(bindingCtx.Object)
.ConfigureAwait(false);
// assert
Assert.True(bindingCtx.Object.ModelState.ErrorCount > 0);
}
【问题讨论】:
标签: c# unit-testing debugging visual-studio-debugging xunit