Здравствуйте, я пытаюсь понять, почему я получаю это исключение:
Message: System.Net.Sockets.SocketException : An existing connection was forcibly closed by the remote host
Я выполняю модульные тесты с использованием NUnit и использую один и тот же экземпляр сервера redis для всех тестов (размещенных наlocal).
Первый набор модульных тестов работает как чудо - я могу отправлять и получать данные с сервера 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;
}
}
}
PS Метод 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);
}
}
Я добавил картинку с иерархией теста: