C# 如何对包含i/o文件的netty处理程序进行单元测试?

C# 如何对包含i/o文件的netty处理程序进行单元测试?,c#,unit-testing,mocking,moq,netty,C#,Unit Testing,Mocking,Moq,Netty,在channelhandleradapter的channelRead中,我正在写入一个文件, 我知道如何使用embeddedchannel对netty处理程序进行单元测试, 但是,当我们在AnnelRead中进行文件I/O时,如何对这个处理程序进行单元测试呢?类似于没有i/O文件依赖关系的mock public class LogHandler : ChannelHandlerAdapter { const string Path = @"L:\Log.txt";

在channelhandleradapter的channelRead中,我正在写入一个文件, 我知道如何使用embeddedchannel对netty处理程序进行单元测试, 但是,当我们在AnnelRead中进行文件I/O时,如何对这个处理程序进行单元测试呢?类似于没有i/O文件依赖关系的mock

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);
            }

        }
}
您仍然可以使用EmbeddedChannel。只需使用writeInbound。。。并验证它是否返回false。调用channel.finish后,请验证文件中写入的内容

您的类取决于StreamWriter类。您需要以这样的方式更改类:从调用方提供这些依赖项,并且可以在单元测试中对其进行模拟。因此,您可以为StreamWriter实例化创建一个简单的包装器类,在类中使用该包装器类,并将其注入构造函数/per setter。在您的单元测试设置中,创建模拟以返回一个本地StreamWriter,您可以使用它来验证编写的内容