Простой класс с использованием TcpListener (это только представить проблему, отнюдь не этот класс делает никакого практического Sence):NUnit поддерживает TCP соединения живых
using System;
using System.Net.Sockets;
namespace NUnitTcp
{
public class Foo
{
TcpListener lst;
public Foo()
{
lst = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), 9090);
}
~Foo()
{
lst.Stop();
}
public void Start()
{
lst.Start();
}
public void Stop()
{
lst.Stop();
}
}
}
Простое приложение, которое использует Foo:
using System;
namespace NUnitTcp
{
class Program
{
static void Main(string[] args)
{
Foo f = new Foo();
f.Start();
}
}
}
Это приложение работает нормально, порт выдается, как только приложение заканчивается, и приложение может быть запущено снова! Даже без деструктора в Foo это все равно произойдет!
Простой тест NUnit с Foo:
using System;
using NUnitTcp;
using NUnit.Framework;
namespace NUnitTcpTests
{
[TestFixture]
public class TcpTests
{
[Test]
public void test1()
{
Foo f = new Foo();
f.Start();
Assert.True(true);
}
}
}
Этот тест будет выполняться только один раз в GUI штуковина NUnit. Любое последующее выполнение этого теста вызовет исключение, сообщив нам, что порт используется. Перезапуск NUnit GUI приведет к освобождению порта.
Вы считаете это ошибкой? Мне кажется, как один ...
КОРРЕКЦИЯ - тест будет случайным образом выбросить исключение, для меня около 70% времени.
Отлично! это все объясняет! Спасибо –
Я решил добавить предложение [TearDown] к моим модульным тестам, где я всегда останавливаю сервер. Я принимаю ваш ответ, хотя он объясняет проблему и правильное решение. –