У меня раньше была эта проблема, и я прибегнул к использованию перегрузки строки для ShouldHaveValidationErrorFor
Следующие тесты (nunit) прошли
[TestCase(null)]
[TestCase("")]
public void Id_InvalidValue_HasError(string id)
{
var fixture = new Fixture();
var datum = fixture.Build<PatchDTO.Datum>().With(x => x.Id, id).Create();
var dto = fixture.Build<PatchDTO>().With(x => x.Data, new List<PatchDTO.Datum> { datum }).Create();
var validator = new PatchDTOValidator();
var validationResult = validator.TestValidate(dto);
validationResult.ShouldHaveValidationErrorFor("Data[0].Id")
.WithErrorMessage("Invalid 'Data.Id' value");
}
Прошло много времени с тех пор, как я посмотрел в этом, но я полагаю, что проблема в расширении ShouldHaveValidationErrorFor
, совпадающем по имени свойства, и перегрузка выражения свойства не разрешает имя свойства в 'Data [0] .Id'. Если вы проверите результаты проверки, вы получите объект ValidationError
, который выглядит примерно так:
{
"PropertyName":"Data[0].Id",
"ErrorMessage":"Invalid 'Data.Id' value",
"AttemptedValue":"",
"CustomState":null,
"Severity":0,
"ErrorCode":"NotEmptyValidator",
"FormattedMessageArguments":[
],
"FormattedMessagePlaceholderValues":{
"PropertyName":"Id",
"PropertyValue":""
},
"ResourceName":null
}
EDIT:
Быстро взглянул на перегрузку выражения свойства, как показано ниже
public IEnumerable<ValidationFailure> ShouldHaveValidationErrorFor<TProperty>(Expression<Func<T, TProperty>> memberAccessor)
{
return ValidationTestExtension.ShouldHaveValidationError(this.Errors, ValidatorOptions.PropertyNameResolver(typeof (T), memberAccessor.GetMember<T, TProperty>(), (LambdaExpression) memberAccessor), true);
}
Предположительно, вы можете использовать другой / написать свой собственный обработчик имен свойств для обработки случая, так как он настраивается. Вам, вероятно, придется покопаться в выражении, чтобы сделать это.