【问题标题】:Connection was forcibly closed by the remote host on receive连接被远程主机在接收时强行关闭
【发布时间】:2018-06-13 07:09:52
【问题描述】:

您好,我想了解为什么会出现此异常:

Message: System.Net.Sockets.SocketException : An existing connection was forcibly closed by the remote host

我正在使用 NUnit 执行单元测试,并且我对所有测试使用相同的 redis-server 实例(托管在本地)。

第一个单元测试集就像一个魅力——我可以从 Redis 服务器发送和接收数据。 在第二个测试中,我可以发送,但在接收时抛出异常。我是否必须在测试之间关闭套接字(假设它在超出测试范围时没有被处理)或者在切换时我必须注意什么对另一个进行单元测试?

测试有效

class RedisTests
    {
        [TestCase("*2\r\n$3\r\nget\r\n$1\r\na\r\n","$1\r\n3\r\n")]
        [TestCase("*3\r\n$3\r\nset\r\n$1\r\na\r\n$1\r\n3\r\n", "+OK\r\n",Description ="Cmd:Set a 3 Result: +OK\r\n")]
        public async Task RedisSetTest(string command, string expectedResult)
        {
            Socket socket = TConstants.MakeSocket();
            IPEndPoint redisPoint = TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS,TConstants.REDIS_PORT);
            await socket.ConnectAsync(redisPoint);
            Provider provider = Provider.Create(socket, 30);

            await socket.SendAsync(TConstants.UTF8Encode(command), SocketFlags.None);
            try
            {
                SmartMemory memory = await provider.ReceiveAsync();
                var payload = Extensions.Map(x => (char)x,
                                             memory.Iterator.Slice(0, memory.Message.Length).ToEnumerable()
                    );
                string result = string.Concat(payload);
                Assert.AreEqual(expectedResult, result);
            }
            catch (Exception exception)
            {
                Debug.WriteLine(exception.Message);
                throw;
            }


        }
    }

P.S Provider's 方法 ReceiveAsync 只是一个包装器,并以相同的方式在其核心执行 Socket.ReceiveAsync

抛出异常的测试

    class STMTests
        {

            [TestCase(2)]
            public async Task FillIntegerNode(int value)
            {

                Socket socket = TConstants.MakeSocket();
                IPEndPoint redisPoint=TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS, TConstants.REDIS_PORT);
                //port = 6379
                //address="127.0.0.1"
                await socket.ConnectAsync(redisPoint);


                Memory<byte>data=BitConverter.GetBytes(injectableNode.Value);
                int sent=await socket.SendAsync(data, SocketFlags.None);


                Memory<byte> dt = new byte[33];
                var mem = await socket.ReceiveAsync(dt, SocketFlags.None);


                Assert.IsTrue(true);

            }
        }

我添加了一张带有测试层次结构的图片:

【问题讨论】:

    标签: unit-testing sockets redis nunit


    【解决方案1】:

    一般规则是,如果您创造了一次性的东西,那么您就是负责处理它的人。在这种情况下,您将在每个测试中创建套接字,就在测试方法本身中。所以你必须在测试方法或TearDown 中处理它,它在每个测试方法之后立即运行。

    通常,处理测试中创建的内容的最简单方法是通过using

    OTOH,如果您希望测试夹具类中的所有方法都使用同一个套接字,您应该在 OneTimeSetUp 方法中打开它并在 OneTimeTearDown 中处理它。

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 2021-05-12
      相关资源
      最近更新 更多