Модульное тестирование валидатора FluentValidator с помощью Moq - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь написать модульный тест, который работает с предоставленной фреймворком, который я использую (кастом).Так что я пытаюсь получить перевод ошибок из базы данных с помощью QueryDispatcher, представленного здесь (работа в процессе, может быть, лучше узнать):

public Task<TModel> ExecuteAsync<TModel>(IQuery<TModel> query)
{
    var validatorType = typeof(IValidator<>).MakeGenericType(query.GetType());

    if (componentContext.TryResolve(validatorType, out object instance))
    {
        var validator = instance as IValidator;
        var result = validator.Validate(query); ///<-- THIS LINE IS NULL

        if (result != null && !result.IsValid)
        {
            List<TranslationQueryModel> errors = new List<TranslationQueryModel>();

            foreach (var item in result.Errors)
            {
                var message = item.ErrorMessage.Split('.');
                string lang = ((ClaimsIdentity)contextAccessor.HttpContext.User.Identity).Claims.SingleOrDefault(s => s.Type == "lang")?.Value.ToUpper();

                errors.Add(ExecuteAsync(new GetErrorTranslationQuery()
                {
                    ObjectName = message.First(),
                    ObjectField = $"{message[1]}.{message[2]}",
                    Language = lang
                }).Result);
            }

            throw new ApplicationException(JsonConvert.SerializeObject(errors));
        }

#if DEBUG
        Debug.WriteIf(result == null, $"Did you forget a validator for {typeof(TModel).Name}?");
#endif
    }

    var queryHandlerType = typeof(IQueryHandler<,>).MakeGenericType(query.GetType(), typeof(TModel));

    var handler = componentContext.Resolve(queryHandlerType);

    return (Task<TModel>)queryHandlerType
        .GetMethod("HandleAsync")
        .Invoke(handler, new object[] { query });
}

И следующее, что я пытаюсь вмодульный тест выглядит следующим образом:

[Fact]
public async Task get_schedule_without_securable_should_show_error()
{
    var request = GetScheduleRequestOk();
    request.Securable = Securable.None;
    var controllerContext = FakeControllerContext(Configuration);

    var queryDispatcher = new Mock<QueryDispatcher>(ComponentContext, ContextAccessor).As<IQueryDispatcher>();
    queryDispatcher.Setup(q => q.ExecuteAsync(It.IsAny<GetScheduleListQuery>()))
    .Throws(new ApplicationException(JsonConvert.SerializeObject(new List<TranslationQueryModel>()
    {
        new TranslationQueryModel()
        {
            Error = "GetScheduleListQuery.ErrorMessage.SecurableIsNull"
        }
    })));

    var cache = new MemoryCache(new MemoryCacheOptions());

    _scheduleController = new ScheduleController(queryDispatcher.Object, cache)
    {
        ControllerContext = controllerContext
    };

    var response = await _scheduleController.GetSchedules(request);

    response.Should().BeOfType(typeof(BadRequestObjectResult));
}

Так что мой вопрос, всегда ли нужно передавать результат макета запроса с помощью моего макета QueryDispatcher, чтобы "проверить", отображается ли ошибка правильно, потому что на самом деле это не такнажмите на код в Валидаторе, и он не покажет ошибку должным образом.Если кто-нибудь может указать мне правильное направление, это было бы здорово.

...