【问题标题】:Debugging .net Core IModelBinder has Visual Studio Skipping Lines [duplicate]调试 .net Core IModelBinder 具有 Visual Studio 跳线 [重复]
【发布时间】:2019-03-15 03:31:38
【问题描述】:

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

  1. 在 JsonModelBinder 中没有达到我所有的断点
  2. 即使遇到每个 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


    【解决方案1】:

    如果您打开所有异常 (Ctrl+Alt+E) 并检查公共语言运行时异常,我会在运行您的测试时遇到 FileNotFound 异常。

    添加对丢失包的引用(我找到了这两个)

    &lt;PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" /&gt; &lt;PackageReference Include="Newtonsoft.Json" Version="11.0.2" /&gt;

    应该解决它。

    HTH

    【讨论】:

    • 很遗憾,这不是分辨率。
    【解决方案2】:

    我的问题已在此帖子中得到解答:Asp.net core 2.2 ModelBinder Unit Test Issues

    解决方案根目录中隐藏的 .vs 文件夹中的某些内容已损坏。删除此文件夹的内容并重建解决方案有效。

    【讨论】:

    • 很高兴您找到了解决问题的方法。如果提供的答案如您所说,那么您应该接受它作为答案。由于此问题与链接问题直接相关,因此我将此问题作为另一个问题中遇到的问题的重复而结束。如果您愿意,您可以随时删除此问题。前提是这个问题的另一个答案没有得到赞成票。编码愉快。
    猜你喜欢
    • 2017-04-07
    • 2017-08-15
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多