Я пытаюсь написать модульный тест, который работает с предоставленной фреймворком, который я использую (кастом).Так что я пытаюсь получить перевод ошибок из базы данных с помощью 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, чтобы "проверить", отображается ли ошибка правильно, потому что на самом деле это не такнажмите на код в Валидаторе, и он не покажет ошибку должным образом.Если кто-нибудь может указать мне правильное направление, это было бы здорово.