Установка свойства в классе, который имеет внутренний установщик для использования в тестировании (C #) - PullRequest
0 голосов
/ 30 ноября 2018

Я использую NJsonSchema для проверки ввода JSON.

У меня есть небольшой класс, который принимает коллекцию объектов ValidationError и создает более удобные сообщения об ошибках, используя содержимое каждой ошибки проверки.

Я хочу написать модульные тесты для этого класса, однако я столкнулся с проблемой.Один из обработчиков сообщений в моем классе отвечает за обработку NotInEnumeration ошибок, и для этого он использует свойство Enumeration в JsonSchema4 объекте, содержащемся в ValidationError, и создает красиво отформатированное сообщение об ошибке.

При написании теста для этого конкретного обработчика я обнаружил, что следующее недопустимо:

JsonSchema4 enumSchema = new JsonSchema4();
enumSchema.Enumeration = new List<object>{ "A", "B", "C" };

Это потому, что свойство Enumeration имеет внутренний установщик.

Мне нужно иметь возможность установить перечисление ошибки проверки, поскольку объект должен передаваться в конструктор ValidationError, который затем читается моим обработчиком, как показано ниже.

private string NotInEnumerationHandler(ValidationError error)
        {
            var userFriendlyErrorString = "Answer must be within range: ";
            var enumString = "[" + string.Join<object>(", ", error.Schema.Enumeration) + "]";
            userFriendlyErrorString += enumString;
            return userFriendlyErrorString;
        }

Я не могу смоделировать объект JsonSchema4, используя moq, так как moq не допускает насмешку не виртуальных методов.

По существу детали не очень важны, но я хотел бы знать, есть лиспособ установки внутреннего сеттера, чтобы я мог протестировать этот конкретный метод в своем классе.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Это не полный ответ, я просто слишком много вставил в комментарий, а также он не форматируется правильно.Вот пример того, как должен выглядеть ваш AssemblyInfo.cs:

using System.Reflection;
using System.Runtime.CompilerServices;

[assembly: AssemblyTitle("Assembly.Fully.Qualified.Name")]
[assembly: AssemblyDescription("")]

#if DEBUG
[assembly: InternalsVisibleTo("Assembly.Fully.Qualified.Name")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
#endif

Вам нужен нижний из двух атрибутов DynamicProxyGenAssembly2, чтобы Moq мог видеть внутренние компоненты.Вам может не понадобиться переключатель Debug и Release, в этом случае не беспокойтесь о разделе #if DEBUG.

0 голосов
/ 30 ноября 2018

JsonSchema4.Enumeration - это ICollection<Object>.

Поэтому мне не нужно устанавливать значение Enumeration для новой коллекции, я могу просто добавить нужные элементы в существующую.

0 голосов
/ 30 ноября 2018

Вы можете использовать отражение, чтобы установить, сначала вам нужно получить информацию о свойстве свойства, а затем установить значение для созданного вами экземпляра.

var enumSchema = new JsonSchema4();
var propertyInfo = typeof(JsonSchema4).GetProperty("Enumeration", BindingFlags.Public | BindingFlags.Instance);
propertyInfo.SetValue(enumSchema, new List<object> { "A", "B", "C" });

И вот как вы можете убедиться, что это работает

Console.WriteLine(propertyInfo.GetValue(enumSchema, null));

Вы можете создать метод расширения, чтобы предоставить вам свойство "Enumeration" в вашей тестовой сборке.

...