как тестировать обработчик netty, который включал файл ввода / вывода в него? - PullRequest
0 голосов
/ 18 февраля 2019

в channelRead канала handleradapter, который я пишу в файл, я знаю, как использовать встроенный канал для модульного тестирования обработчиков netty, но как выполнить модульное тестирование этого обработчика, когда мы выполняем внутри него файловый ввод-вывод (ChannelRead)?что-то вроде макета без зависимости от файла ввода / вывода.

public class LogHandler : ChannelHandlerAdapter
   {

       const string Path = @"L:\Log.txt";
        public override void ChannelActive(IChannelHandlerContext context)
        {
            base.ChannelActive(context);
        }

        public override Task WriteAsync(IChannelHandlerContext context, object message)
        {
            Logger.SentLog(message as IByteBuffer);
            return context.WriteAsync(message as IByteBuffer);
        }

        public override void ChannelRead(IChannelHandlerContext context, object message)
        {

            string msg = Convertor.ByteBufferToString(message as IByteBuffer);
            IByteBuffer initialMessage = Unpooled.Buffer(1024);
            byte[] messageBytes = Encoding.UTF8.GetBytes(msg);
            initialMessage.WriteBytes(messageBytes);


            using (StreamWriter writer = new StreamWriter(Path, true))
            {
                writer.WriteLine($"(Read){System.DateTime.Now} -> {BitConverter.ToString(messageBytes).Replace("-"," ")}");
            }

            if (msg != "Timeout")
            {
                base.ChannelRead(context, message);
            }

        }
}

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Ваш класс зависит от StreamWriter класса.Вам нужно изменить свой класс таким образом, чтобы вы предоставили эти зависимости от вызывающей стороны и чтобы вы могли имитировать его в своих модульных тестах.Следовательно, вы можете создать простой класс-оболочку для экземпляра StreamWriter, использовать этот класс-оболочку в своем классе и внедрить его в конструктор / на каждый установщик.И в вашем модульном тесте настройте макет для возврата локального StreamWriter, который вы можете использовать для проверки написанного содержимого.

0 голосов
/ 18 февраля 2019

Вы все еще можете использовать EmbeddedChannel.Просто используйте writeInbound(...) и убедитесь, что он возвращает false.Затем, как только вы позвоните channel.finish(), проверьте, что было написано в файле.

...