Мои предположения об указании JsonReferenceResolver были в правой строке.В приведенном выше примере я не смог получить ссылку на common.json из root.json для «работы» в тестовой среде, потому что в этой среде сервис / путь не существовал.
Так что при настройкеЯ знаю, что такое common.json, то есть знаю, что это содержимое в виде строки, и поэтому могу получить его в виде схемы (JsonSchema4 commonSchema = JsonSchema4.FromJsonAsync(commonJsonAsString).Result;
).
Используя это, я могу установить 'Factory Resolver Factory''и добавьте в него ссылку на документ так, чтобы все ссылки на http://testapi/schemas/common.json#/...
были получены из моего commonSchema
, т. е.
private Func<JsonSchema4, JsonReferenceResolver> referenceResolverFactory;
this.referenceResolverFactory = x =>
{
JsonSchemaResolver schemaResolver = new JsonSchemaResolver(x, new JsonSchemaGeneratorSettings());
JsonReferenceResolver referenceResolver = new JsonReferenceResolver(schemaResolver);
referenceResolver.AddDocumentReference("http://testapi/schemas/common.json", commonSchema);
return referenceResolver;
};
Различные ссылки могут быть разрешены путем добавления большего количества ссылок на документы таким же образом.
Затем, когда я пытаюсь преобразовать схему root.json (со ссылкой на common.json) или другую схему (которая ссылается на common.json), я использую перегрузку FromJsonAsync
, которая передается в referenceResolverFactory
:
private bool GetAndValidateResponse(string schemaName, string response, string schemaAsString)
{
// schemaName: Name of the schema being validated, e.g. "root.json"
// response: http response body as a string, see 'Example response' in question
// schemaAsString: The schema being validate as a string, e.g. root.json contents in question
//
// Check the response object against the schema
JsonSchema4 schema = JsonSchema4.FromJsonAsync(schemaAsString, schemaName, this.referenceResolverFactory).Result;
ICollection<ValidationError> errors = schema.Validate(response);
return errors.Count < 1;
}
В моем случае для модульных тестов меня интересовало только то, что он действителен или нет, поэтому логическое возвращаемое значение.Если вас интересуют точные ошибки, очевидно, вы можете вернуть коллекцию.
Также я настраиваю фабрику только один раз для класса юнит-теста, а не для теста.Тем не менее, он по праву идет на завод для каждого ref
в схеме.