首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试.net核心IModelBinder有Visual跳线

调试.net核心IModelBinder有Visual跳线
EN

Stack Overflow用户
提问于 2019-03-06 02:57:10
回答 2查看 165关注 0票数 0

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

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

我的其他xUnits都没有这样的行为。在这一点上,唯一给我带来麻烦的单位是一个与asp.net核心管道相关的单元。我试着清理我的解决方案和重新添加项目推荐人认为一个可能有一个旧的pdb文件?

我使用的是Moq,xUnit,VS2017,ASP.net Core2.2。

// JsonModelBinder

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
    }
EN

回答 2

Stack Overflow用户

发布于 2019-03-06 20:17:07

如果打开所有异常(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
EN

Stack Overflow用户

发布于 2019-03-14 19:31:38

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

在解决方案根目录中的隐藏.vs文件夹中,有些东西正在损坏。删除此文件夹的内容并重新生成解决方案的工作正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55014848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档