这个问题在这里已有答案:
我正在尝试调试与自定义IModelBinder实现相关的xUnit,Visual Studio调试器是:
我的其他xUnits都不是这样的。在这一点上,唯一让我烦恼的单位是与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);
}
如果您打开所有异常(Ctrl + Alt + E)并检查公共语言运行时异常,我会得到运行测试的FileNotFound异常。
添加缺少包的引用(我发现这些2)
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
应该解决它。
HTH
我在这篇文章中回答了我的问题:Asp.net core 2.2 ModelBinder Unit Test Issues
在解决方案的根目录中隐藏的.vs文件夹中有些东西被破坏了。删除此文件夹的内容并重建解决方案。