Unit testing 使用httptest或http包模拟服务器故障

Unit testing 使用httptest或http包模拟服务器故障,unit-testing,go,mocking,Unit Testing,Go,Mocking,如何在独立单元测试中使用httptest或http包模拟服务器故障 详细信息: 我一直在使用gorilla WebSocket,所以当服务器停机时,mt值必须为-1。 我尝试了以下作为主要选项: var srv *httptest.Server srv = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, err := wsUpgrader.Upgrade(w, r

如何在独立单元测试中使用httptest或http包模拟服务器故障

详细信息:
我一直在使用gorilla WebSocket,所以当服务器停机时,mt值必须为-1。 我尝试了以下作为主要选项:

var srv *httptest.Server

srv = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   _, err := wsUpgrader.Upgrade(w, r, nil)
   if err != nil {
      t.Fatal(err)
   }

   srv.Close()
}))

但客户根本没有收到任何消息。此外,我还尝试了标准http服务器,但recover()之后,客户端也没有收到任何消息
srv.CloseClientConnections()
没有帮助,客户端像以前一样等待消息。

在WS-server端的客户端连接上调用
conn.Close()
就足够了,以便在不发送关闭帧的情况下终止连接。这将触发异常连接关闭的行为,消息类型的值将为
-1


在连接升级到websocket后,它被劫持,通用http服务器无法再处理此连接,这就是为什么服务器关闭对劫持的连接不起作用。

没有
-1
消息类型。为什么必须
ReadMessage
返回
-1
?此外,如果服务器实际出现故障,则不会有任何消息;但是在任何一种情况下,您都应该使用错误值而不是消息类型来检查错误。@JimB在
wsarecv的情况下:现有连接被远程主机强制关闭。
error
ReadMessage
-1
作为消息类型返回。可能,使用此值不是一个好主意,因为RFC中没有对其进行描述,所以请您建议如何通过错误值检查强制关闭的连接?而不比较
err.error()
和整个
wsarecv:远程主机强制关闭了一个现有连接。
string您测试的实际目标是什么?您似乎在测试gorilla包的实现细节,而不是您的代码。如果出现服务器错误,您应该预期会出现错误,但可能存在多种错误情况。如果您正在测试一个错误路径,那么用一个错误检查它,但不要依赖于特定的错误。