У меня есть абстрактный валидатор со следующей структурой:
public abstract class RiskAssessmentServiceCreateRequestValidator<T>
: AbstractValidator<T> where T
: IRiskAssessmentServiceCreateRequest
{
public RiskAssessmentServiceCreateRequestValidator(ApplicationContext context)
{
RuleSet("modelBinding", () =>
{
RuleFor(x => x.ServiceProviderId).NotNull().GreaterThan(0);
});
RuleSet("handler", () =>
{
//....
});
}
}
В моем обработчике запросов я вызываю производный экземпляр этого класса следующим образом:
var validationResult = _validator.Validate(request, ruleSet: "handler");
Как можно Я высмеиваю этот конкретный вызов Validate в моих модульных тестах? Если бы я не использовал наборы правил, моя программа установки выглядела бы следующим образом:
_validator.Setup(x => x.Validate(It.IsAny<CreateRequest>()))
.Returns(validationResult);
Следующий вызов недопустим, поскольку необязательные параметры не допускаются в дереве выражений:
_validator.Setup(x => x.Validate(
It.IsAny<CreateRequest>(),
ruleSet: It.IsAny<string>()))
.Returns(validationResult);
Теоретически я мог бы установить это так:
_validator.Setup(x => x.Validate(
It.IsAny<CreateRequest>(),
(IValidatorSelector)null,
It.IsAny<string>()))
.Returns(validationResult);
Но тогда это приведет к:
System.NotSupportedException : Unsupported expression: x => x.Validate<CreateRequest>(It.IsAny<CreateRequest>(), null, It.IsAny<string>())
Extension methods (here: DefaultValidatorExtensions.Validate) may not be used in setup / verification expressions.
За исключением использования реального валидатора, которого я хочу избежать, как можно Я решил это и настроил Moq подходящим способом?