Jeer
@Jeer
уверенный пользователь

Как разобраться с делегатами?

Привет, вот есть код:
[TestCaseSource(nameof(AuthTestCases))]
    public void AuthMethod_IsNotConfigurable(Action<ConsumerConfig> initialize)
    {
        var consumerConfig = new ConsumerConfig();
        initialize(consumerConfig);
        var e = Assert.Catch<ArgumentException>(() => consumerConfig.Configure(new KafkaOptions()),
            "Configure authentication using KafkaOptions.");
        Assert.That(e!.Message, Is.EqualTo("Configure authentication using KafkaOptions. (Parameter 'config')"));
    }

    private static IEnumerable<Action<ConsumerConfig>> AuthTestCases()
    {
        yield return x => x.SecurityProtocol = SecurityProtocol.Plaintext;
        yield return x => x.SaslMechanism = SaslMechanism.Plain;
        yield return x => x.SaslOauthbearerConfig = "";
        yield return x => x.SaslUsername = "";
        yield return x => x.SaslPassword = "";
        yield return x => x.EnableSslCertificateVerification = true;
    }

ConsumerConfig тут плоский объект с настройками. Метод Configure проверяет, что какие-то определенные настройки не поменяли или заданы логин, пароль, например. Все это работает корректно.
В мое осознание никак не помещается момент, что над плоскими настройками мы можем выполнить какие-то действия, которые завернуты в анонимную лямда-функцию. Типа, что за функция придет - непонятно, нужно смотреть все вызовы (ну в данном случае все на одном экране, но обычно вызовы черти где). Что может быть внутри этой функции, тоже непонятно, да что угодно.
Ну как бы, когда читаю такой код, как в этом моменте, например, с трудом, но разбираюсь, как он работает. И по другому, попроще, тут не сделать - то есть это обычный нормальный подход. В реальном коде, когда все разбросано по разным файлам, еще тяжелее понимать, что происходит, но в целом просто нужно больше времени, чтобы осознать как работает код.
А вот сам писать такое вообще не могу. И в этом и заключается вопрос, как можно принять и усвоить такой подход? Может есть что-то почитать/посмотреть или упражнения какие-то?
  • Вопрос задан
  • 171 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Kano
Нужно всегда держать в памяти что все методы помеченные специальными атрибутами будет выполнять некий тестовый фреймворк, в вашем случае это NUnit.
Фреймворк находит все методы которые являются тестовым сценарием (размечены атрибутами) и запускает выполнение этих методов одним из способов (зависит от типа атрибута или атрибутов и их параметров)

В вашем случае атрибут TestCaseSource указывает что данные для теста нужно получить из метода AuthTestCases, который возвращает перечисление (IEnumerable), поэтому фреймворк решает запустить тестовый сценарий AuthMethod_IsNotConfigurable столько раз сколько сможет получить для него данных из перечисления.

Ну а дальше дело техники метод AuthMethod_IsNotConfigurable получает делегат и выполняет его

Можно немного изменить код:
[TestCaseSource(nameof(_authTestCases))]
        public void AuthMethod_IsNotConfigurable(ConsumerConfig consumerConfig)
        {
            var e = Assert.Catch<ArgumentException>(() => consumerConfig.Configure(new KafkaOptions()),
                "Configure authentication using KafkaOptions.");
            Assert.That(e!.Message, Is.EqualTo("Configure authentication using KafkaOptions. (Parameter 'config')"));
        }

        private readonly static ConsumerConfig[] _authTestCases =
        {
            new (SecurityProtocol: SecurityProtocol.Plaintext),
            new (SaslMechanism: SaslMechanism.Plain),
            new (SaslOauthbearerConfig: ""),
            new (SaslUsername: ""),
            new (SaslPassword : ""),
            new (EnableSslCertificateVerification: true)
        };
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы