繁体   English   中英

Asp.net core 2.2 ModelBinder 单元测试问题

[英]Asp.net core 2.2 ModelBinder Unit Test Issues

在尝试针对 asp.net 核心管道的组件调试 xUnit 时,我看到了奇怪的行为。 下面发布的代码删除了所有有目的的功能,仅用于说明问题:

  1. 没有在 JsonModelBinder 中达到我所有的断点。
  2. 即使正在评估它,也不会退出“返回 Task.Completed”。

JsonModelBinder 的生产代码包含更多用于反序列化传入字符串数据的逻辑。 此代码包含失败逻辑,其中包含许多返回 Task.Completed 语句。 使用此代码时,调试器将评估这些返回语句,但会继续前进,直到到达方法末尾才返回,始终到达末尾。

我使用的是 Moq、xUnit、VS2017、ASP.net Core 2.2。

// 简单的事实

    [Fact]
    public async Task BindModelAsync_WithNullValueProvider_SetsDefaultError()
    {
        // arrange

        var queryStringCollection = new RouteValueDictionary
        {
            {"Page", "1"},
            {"Size", "20"}
        };

        var valueProvider = new RouteValueProvider(BindingSource.Path, queryStringCollection);

        ModelBindingContext bindingContext = new DefaultModelBindingContext
        {
            ModelName = "Test",
            ValueProvider = valueProvider
        };

        var jsonBinder = new JsonModelBinder();

        // act

        await jsonBinder.BindModelAsync(bindingContext);

        // not point in asserting :-)
    }

// JsonModelBinder

public class JsonModelBinder : IModelBinder
{
    private readonly IOptions<MvcJsonOptions> _jsonOptions;
    private readonly ILoggerFactory _loggerFactory;

    public JsonModelBinder() { }

    public Task BindModelAsync(ModelBindingContext bindCtx)
    {
        string modelName = bindCtx.ModelName;

        Debug.Print(modelName);

        if (string.IsNullOrEmpty(modelName))
        {
            return Task.CompletedTask;
        }

        return Task.CompletedTask;
    }
}

modelName 为 null 但 bindCtx.ModelName 等于“Test”

**编辑项目参考

在此处输入图片说明

我的一位同事遇到了同样的问题。 经过大量调试和调查,我们发现这为他解决了问题。

  1. 右键单击 Visual Studio 中的解决方案并执行“清洁解决方案”。
  2. 手动删除项目的 obj 和 bin 文件夹中的内容。
  3. 删除解决方案根目录中 .vs 文件夹的内容。 (如果文件被锁定,请关闭 Visual Studio。)

最后一步似乎是重要的部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM