首页 > 解决方案 > 使用 httptest 或 http 包模拟服务器故障

问题描述

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

详细信息:
我一直在使用 gorilla websockets,所以当服务器宕机时, mt, msg, err := t.conn.ReadMessage() 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()没有帮助,客户像以前一样等待消息。

标签: unit-testinggomocking

解决方案


在 WS 服务器端调用conn.Close()客户端连接以终止连接而不发送关闭帧就足够了。这将触发异常连接关闭的行为,并且消息类型的值为-1.

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


推荐阅读