我想使用单元测试来测试HTTP Listener的功能。但是我很难让它在完成后停止聆听。
private HttpListener listener = new HttpListener();
public ListenerTests()
{
listener.Start("1234");
}
//Test if the listener can respond
[TestMethod]
public void TestResponse()
{
WebClient client = new WebClient();
string response = client.DownloadString("http://localhost:1234/");
Assert.IsNotNull(response);
}
//Test if the server can stop without issues
[TestMethod]
public void TestStop()
{
listener.Stop();
}
如果我只运行TestStop()测试,那么它将始终停止监听,而在第二次运行时它可以正常工作。如果我同时运行它将第一次正常工作,但第二次测试执行引擎"仍在运行,而端口不可用。
我认为在所有测试之后运行Stop()可以解决问题...但我无法弄清楚如何?
我尝试使用Ordered Tests但是它有各种不同的问题。即使我改变了它上面的端口来监听它,它似乎随机使用我之前选择的一个,然后永远不可用。而且,它远非理想。
答案 0 :(得分:3)
您可以使用TestCleanupAttribute在测试完成后清理所有内容。
[TestCleanup]
public void TestStop()
{
listener.Stop();
}
将你的Init放在ClassInitializeAttribute中:
[ClassInitialize]
public void ListenerInit()
{
listener.Start("1234");
}
答案 1 :(得分:0)
根据Structure of Unit Tests和Anatomy of a Unit Test下提供的信息,您应该使用属性ClassCleanUp
创建一个清理方法,以便在完成所有测试后停止HttpListener。
除了ClassCleanUp
标记之外,您还可以使用ClassInitialize
标记正在创建HttpListener的方法,以确保在执行测试之前始终调用HttpListener,从而无需调用你当前的构造函数。