调试.net Core IModelBinder有Visual Studio跳过线[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我正在尝试调试与自定义IModelBinder实现相关的xUnit,Visual Studio调试器是:

  1. 没有在JsonModelBinder中击中我的所有断点
  2. 即使它击中每个Task.Completed,也不会退出Task.Completed。

我的其他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);
    }
c# unit-testing debugging visual-studio-debugging xunit
2个回答
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


0
投票

我在这篇文章中回答了我的问题:Asp.net core 2.2 ModelBinder Unit Test Issues

在解决方案的根目录中隐藏的.vs文件夹中有些东西被破坏了。删除此文件夹的内容并重建解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.