Asp.net core 2.2 Проблемы с модульным тестированием ModelBinder - PullRequest
1 голос
/ 07 марта 2019

Я вижу странное поведение при попытке отладки xUnits для компонентов основного конвейера asp.net. Приведенный ниже код имеет все целенаправленные функциональные возможности, выделенные только для иллюстрации проблемы:

  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 is null yet bindCtx.ModelName is equal to

** Редактировать для проекта Refs

enter image description here

1 Ответ

1 голос
/ 14 марта 2019

Один из моих коллег столкнулся с той же проблемой. После долгих отладок и исследований мы обнаружили, что это решило проблему для него.

  1. Щелкните правой кнопкой мыши решение в Visual Studio и выполните «Чистое решение».
  2. Вручную удалите содержимое папок obj и bin проектов.
  3. Удалите содержимое папки .vs в корне решения. (если файлы заблокированы, закройте Visual Studio.)

Последний шаг, похоже, важная часть.

...